买卖股票的最佳时机 II
累积每个单调升序端一头一尾的差值。
class Solution {
public:
int maxProfit(vector<int>& a) {
int ans = 0 , n = a.size();
int l = 0;
for(int i=1;i<n;i++){
if(a[i]<a[i-1]){
ans += a[i-1]-a[l];
l = i;
}
}
ans += max(0,a[n-1]-a[l]);
return ans;
}
};
有点差分的感觉。
class Solution {
public:
int maxProfit(vector<int>& a) {
int ans = 0 ;
for(int i=1;i<a.size();i++){
ans += max(0,a[i]-a[i-1]);
}
return ans;
}
};
看到有人用DP去做,感觉确实很巧妙,很符合DP的应用场景。很妙!
class Solution {
public:
int maxProfit(vector<int>& a) {
int n = a.size();
if(n<2) return 0;
vector<vector<int>> dp(n,vector<int>(2));
dp[0][0] = 0;
dp[0][1] = -a[0];
for(int i=1;i<n;i++){
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+a[i]);
dp[i][1] = max(dp[i-1][1],dp[i-1][0]-a[i]);
}
return dp[n-1][0];
}
};