1.两数之和
题目链接
class Solution {
public :
vector< int > twoSum ( vector< int > & nums, int target) {
int i, j;
for ( i = 0 ; i < nums. size ( ) - 1 ; i++ )
{
for ( j = i+ 1 ; j < nums. size ( ) ; j++ )
{
if ( nums[ i] + nums[ j] == target)
{
return { i, j} ;
}
}
}
return { i, j} ;
} ;
} ;
11. 盛最多水的容器
>题目链接
class Solution {
public :
int maxArea ( vector< int > & height) {
int result = 0 ;
int i = 0 , j = height. size ( ) - 1 ;
while ( i < j) {
int area = ( j - i) * min ( height[ i] , height[ j] ) ;
result = max ( result, area) ;
if ( height[ i] < height[ j] )
i++ ;
else
j-- ;
}
return result;
}
} ;
15. 三数之和
题目链接
和上一个题类似,用到了双指针,其中需要注意的就是如何节省时间,以及通过排序后判断下一个,避免重复
class Solution {
public :
vector< vector< int >> threeSum ( vector< int > & nums) {
int i = 0 , j, k;
vector< vector< int >> ans;
if ( nums. size ( ) < 3 )
return ans;
sort ( nums. begin ( ) , nums. end ( ) ) ;
if ( nums[ 0 ] > 0 )
return ans;
while ( i < nums. size ( ) ) {
if ( nums[ i] > 0 )
break ;
int left = i + 1 , right = nums. size ( ) - 1 ;
while ( left < right) {
int a = nums[ i] , b = nums[ left] , c = nums[ right] ;
if ( a + b + c == 0 ) {
ans. push_back ( { nums[ i] , nums[ left] , nums[ right] } ) ;
while ( left < right && nums[ left] == nums[ left+ 1 ] )
left++ ;
while ( left < right && nums[ right] == nums[ right- 1 ] )
right-- ;
left++ ;
right-- ;
} else if ( a + b + c > 0 )
right-- ;
else
left++ ;
}
while ( i + 1 < nums. size ( ) && nums[ i] == nums[ i+ 1 ] )
i++ ;
i++ ;
}
return ans;
}
} ;
16. 最接近的三数之和
题目链接
class Solution {
public :
int threeSumClosest ( vector< int > & nums, int target) {
sort ( nums. begin ( ) , nums. end ( ) ) ;
int result = nums[ 0 ] + nums[ 1 ] + nums[ 2 ] ;
int i;
for ( i = 0 ; i < nums. size ( ) ; i++ ) {
int left = i + 1 , right = nums. size ( ) - 1 ;
while ( left < right) {
int ans = nums[ i] + nums[ left] + nums[ right] ;
if ( abs ( target - ans) < abs ( target - result) )
result = ans;
if ( ans > target)
right-- ;
else if ( ans < target)
left++ ;
else
return result;
}
}
return result;
}
} ;
18. 四数之和
题目链接
class Solution {
public :
vector< vector< int >> fourSum ( vector< int > & nums, int target) {
vector< vector< int >> ans;
sort ( nums. begin ( ) , nums. end ( ) ) ;
int i, j, left, right;
for ( i = 0 ; i < nums. size ( ) ; i++ ) {
for ( j = i+ 1 ; j < nums. size ( ) ; j++ ) {
left = j + 1 ; right = nums. size ( ) - 1 ;
while ( left < right) {
if ( nums[ left] + nums[ right] + nums[ i] + nums[ j] == target) {
ans. push_back ( { nums[ i] , nums[ j] , nums[ left] , nums[ right] } ) ;
while ( left < right && nums[ right] == nums[ right - 1 ] )
right-- ;
while ( left < right && nums[ left] == nums[ left + 1 ] )
left++ ;
right-- ;
left++ ;
} else if ( nums[ left] + nums[ right] + nums[ i] + nums[ j] > target)
right-- ;
else
left++ ;
}
while ( j + 1 < nums. size ( ) && nums[ j] == nums[ j + 1 ] )
j++ ;
}
while ( i + 1 < nums. size ( ) && nums[ i] == nums[ i + 1 ] )
i++ ;
}
return ans;
}
} ;
42. 接雨水
题目链接
class Solution {
public :
int trap ( vector< int > & height) {
int sum = 0 ;
for ( int i = 0 ; i < height. size ( ) ; i++ ) {
if ( i == 0 || i == height. size ( ) - 1 )
continue ;
int rHeight = height[ i] ;
int lHeight = height[ i] ;
for ( int r = i + 1 ; r < height. size ( ) ; r++ ) {
if ( height[ r] > rHeight) rHeight = height[ r] ;
}
for ( int l = i - 1 ; l >= 0 ; l-- ) {
if ( height[ l] > lHeight) lHeight = height[ l] ;
}
int h = min ( lHeight, rHeight) - height[ i] ;
if ( h > 0 )
sum + = h;
}
return sum;
}
} ;