棋盘覆盖
题目描述
解题代码
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 ) ;
}