数组
二分法查找
leetcode 704题
class Solution {
public :
int search ( vector< int > & nums, int target) {
int left= 0 ;
int right = nums. size ( ) - 1 ;
while ( left <= right) {
int middle = left + ( ( right - left) >> 1 ) ;
if ( nums[ middle] < target) {
left= middle+ 1 ;
}
else if ( nums[ middle] > target) {
right= middle- 1 ;
}
else {
return middle;
}
}
return - 1 ;
}
} ;
移除元素
leetcode 27题
class Solution {
public :
int removeElement ( vector< int > & nums, int val) {
int size = nums. size ( ) ;
int low = 0 ;
for ( int high = 0 ; high < size; high ++ ) {
if ( nums[ high] != val) {
nums[ low++ ] = nums[ high] ;
}
}
return low;
}
} ;
有序数组的平方
leetcode 977题
class Solution {
public :
vector< int > sortedSquares ( vector< int > & nums) {
int k = nums. size ( ) - 1 ;
vector< int > result ( nums. size ( ) , 0 ) ;
for ( int i = 0 , j = nums. size ( ) - 1 ; i <= j; ) {
if ( nums[ i] * nums[ i] >= nums[ j] * nums[ j] ) {
result[ k-- ] = nums[ i] * nums[ i] ;
i++ ;
}
else {
result[ k-- ] = nums[ j] * nums[ j] ;
j-- ;
}
}
return result;
}
} ;
长度最小的子数组
leetcode 209题
class Solution {
public :
int minSubArrayLen ( int target, vector< int > & nums) {
int slow = 0 ;
int fast = 0 ;
int sum = 0 ;
int result = INT32_MAX;
int i = 0 ;
for ( fast = 0 ; fast < nums. size ( ) ; fast ++ ) {
sum = sum + nums[ fast] ;
while ( sum >= target) {
result = result >= fast - i + 1 ? fast - i + 1 : result;
sum -= nums[ i++ ] ;
}
}
return result == INT32_MAX ? 0 : result;
}
} ;
螺旋矩阵
leetcode 54题
class Solution {
public :
vector< int > spiralOrder ( vector< vector< int >> & matrix) {
int row = matrix. size ( ) ;
int col = matrix[ 0 ] . size ( ) ;
vector< int > ans ( row* col) ;
int start1 = 0 ;
int start2 = 0 ;
int a = row/ 2 ;
int b = col/ 2 ;
int c = row/ 2 ;
int d = col/ 2 ;
int count = 0 ;
while ( a-- && b-- ) {
for ( int i = start1; i < col - 1 - start1; i ++ ) {
ans[ count ++ ] = matrix[ start1] [ i] ;
}
for ( int i = start2; i < row - 1 - start2; i ++ ) {
ans[ count ++ ] = matrix[ i] [ col - 1 - start2] ;
}
for ( int i = start1; i < col - 1 - start1; i ++ ) {
ans[ count ++ ] = matrix[ row - 1 - start1] [ col - 1 - i] ;
}
for ( int i = start2; i< row - 1 - start2; i ++ ) {
ans[ count ++ ] = matrix[ row - 1 - i] [ start2] ;
}
start1 ++ ;
start2 ++ ;
}
if ( a % 2 && col >= row) {
int s = start1;
while ( count < col* row) {
ans[ count ++ ] = matrix[ c] [ s ++ ] ;
}
}
if ( b % 2 && col < row) {
int ss = start1;
while ( count < col* row) {
ans[ count ++ ] = matrix[ ss ++ ] [ d] ;
}
}
return ans;
}
} ;
leetcode 59 题
class Solution {
public :
vector< vector< int >> generateMatrix ( int n) {
vector< vector< int >> res ( n, vector< int > ( n, 0 ) ) ;
int start = 0 ;
int a = n / 2 ;
int mid = n / 2 ;
int cout = 1 ;
while ( a-- ) {
for ( int i = start; i <= n - 2 - start; i ++ ) {
res[ start] [ i] = cout ++ ;
}
for ( int j = start; j <= n - 2 - start; j ++ ) {
res[ j] [ n - 1 - start] = cout ++ ;
}
for ( int s = start; s <= n - 2 - start; s ++ ) {
res[ n - 1 - start] [ n - 1 - s] = cout ++ ;
}
for ( int k = start; k <= n - 2 - start; k ++ ) {
res[ n - 1 - k] [ start] = cout ++ ;
}
start ++ ;
}
if ( n% 2 ) {
res[ mid] [ mid] = n* n;
}
return res;
}
} ;