棋盘覆盖
题目描述


解题代码
void dividedCovering(vector<vector<int>>& chessBoard, int dr, int dc, int sr, int sc, int size) {if (size == 1) return;size /= 2; if (sr < dr + size && sc < dc + size) { divideCovering(chessBoard, dr, dc, sr, sc, size);}else {int nr = dr + size - 1, nc = dc + size - 1; chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr, dc, nr, nc, size);}if (sr < dr + size && sc >= dc + size) { divideCovering(chessBoard, dr, dc + size, sr, sc, size);}else {int nr = dr + size - 1, nc = dc + size;chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr, dc + size, nr, nc, size);}if (sr >= dr + size && sc < dc + size) { divideCovering(chessBoard, dr + size, dc, sr, sc, size);}else {int nr = dr + size, nc = dc + size - 1;chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr + size, dc, nr, nc, size);}if (sr >= dr + size && sc >= dc + size) { divideCovering(chessBoard, dr + size, dc + size, sr, sc, size);}else {int nr = dr + size, nc = dc + size;chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr + size, dc + size, nr, nc, size);}
}void chessBoardCovering(vector<vector<int>>& chessBoard, int sr, int sc) {int n = chessBoard.size();divideCovering(chessBoard, 0, 0, sr, sc, n);
}
线性时间选择
题目描述

解题代码
int partition(vector<int>& nums, int left, int right) {int randIdx = rand() % (right - left + 1) + left; swap(randIdx, nums[left]);int pivot = nums[left];while (left < right) {while (left < right && nums[right] >= pivot) --right;nums[left] = nums[right];while (left < right && nums[left] <= pivot) ++left;nums[right] = nums[left];}nums[left] = pivot;return left;
}int dividedQuickSelect(vector<int>& nums, int left, int right, int k) {if (left >= right) return nums[left];int p = partition(nums, left, right); if (p == k) return nums[p]; else if (p > k) return divideQuickSelect(nums, left, p - 1, k); else return divideQuickSelect(nums, p + 1, right, k);
}int quickSelect(vector<int>& nums, int k) {srand((unsigned)time(nullptr)); return divideQuickSelect(nums, 0, nums.size() - 1, k - 1);
}