滑动窗口最大值
class Solution {
public :
vector< int > maxSlidingWindow ( vector< int > & nums, int k) {
int n = nums. size ( ) ;
deque< int > q;
for ( int i = 0 ; i < k; ++ i) {
while ( ! q. empty ( ) && nums[ i] >= nums[ q. back ( ) ] ) {
q. pop_back ( ) ;
}
q. push_back ( i) ;
}
vector< int > ans = { nums[ q. front ( ) ] } ;
for ( int i = k; i < n; ++ i) {
while ( ! q. empty ( ) && nums[ i] >= nums[ q. back ( ) ] ) {
q. pop_back ( ) ;
}
q. push_back ( i) ;
while ( q. front ( ) <= i - k) {
q. pop_front ( ) ;
}
ans. push_back ( nums[ q. front ( ) ] ) ;
}
return ans;
}
} ;
小偷问题
int rob ( vector< int > & nums) {
if ( nums. size ( ) == 0 ) {
return 0 ;
}
int n= nums. size ( ) ;
vector< int > dp ( n+ 1 , 0 ) ;
dp[ 0 ] = 0 ;
dp[ 1 ] = nums[ 0 ] ;
for ( int k= 2 ; k<= n; k++ ) {
dp[ k] = max ( dp[ k- 1 ] , nums[ k- 1 ] + dp[ k- 2 ] ) ;
}
return dp[ n] ;
}
完全平方数
int numSquares ( int n) {
vector< int > f ( n + 1 ) ;
for ( int i = 1 ; i <= n; i++ ) {
int minn = INT_MAX;
for ( int j = 1 ; j * j <= i; j++ ) {
minn = min ( minn, f[ i - j * j] ) ;
}
f[ i] = minn + 1 ;
}
return f[ n] ;
}
零钱兑换
int coinChange ( vector< int > & coins, int amount) {
int Max = amount + 1 ;
vector< int > dp ( amount + 1 , Max) ;
dp[ 0 ] = 0 ;
for ( int i = 1 ; i <= amount; ++ i) {
for ( int j = 0 ; j < ( int ) coins. size ( ) ; ++ j) {
if ( coins[ j] <= i) {
dp[ i] = min ( dp[ i] , dp[ i - coins[ j] ] + 1 ) ;
}
}
}
return dp[ amount] > amount ? - 1 : dp[ amount] ;
}
最长递增子序列
int lengthOfLIS ( vector< int > & nums) {
int result = 0 ;
if ( nums. size ( ) <= 1 ) return nums. size ( ) ;
vector< int > dp ( nums. size ( ) + 1 , 1 ) ;
for ( int i = 1 ; i < nums. size ( ) ; i++ ) {
for ( int j = 0 ; j < i; j++ ) {
if ( nums[ i] > nums[ j] ) dp[ i] = max ( dp[ j] + 1 , dp[ i] ) ;
}
if ( dp[ i] > result) result = dp[ i] ;
}
return result;
}
反转单词次序
string reverseWords ( string s) {
reverse ( s. begin ( ) , s. end ( ) ) ;
for ( int i= 0 ; i< s. size ( ) ; i++ ) {
int j= i+ 1 ;
while ( s[ j] != ' ' && j< s. size ( ) ) j++ ;
reverse ( s. begin ( ) + i, s. begin ( ) + j) ;
i= j;
}
return s;
}
二叉树的下一个节点(中序遍历)
TreeNode* inorderSuccessor ( TreeNode* p) {
if ( p -> right)
{
p = p -> right;
while ( p -> left) p = p -> left;
return p;
}
while ( p -> father && p == p -> father -> right)
p = p -> father;
return p -> father;
}