每日一题——123. 买卖股票的最佳时机 III
123. 买卖股票的最佳时机 III
分类:
- dp
我以为是动态规划之实际上是暴力
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
// 记录区间[i, j]上的最小值最大值,以使dp[i][j]=该区间上的最大差
int sum = 0;
for(int i=0; i<n; i++){
int _min = prices[i], _max = 0;
dp[i][i] = _max;
for(int j=i+1; j<n; j++){
int diff = prices[j] - _min;
_max = max(_max, diff);
dp[i][j] = _max;
_min = min(_min, prices[j]);
}
sum = max(dp[0][i] + dp[i][n-1], sum);
}
return sum;
}
};
/* O(n^2) TLE **/
动态规划。第i结束时,存在4中产生利润变动的操作:
- 第一次购入股票
buy1 - 第一次卖出股票
sell1 - 已经卖出一次的前提下,第二次购入股票
buy2 - 第二次卖出股票
sell2
对于每一种操作,动态记录操作后的最大利润,那么就有第i+1天的最大利润为:(看代码)
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ini = -prices[0];
int buy1 = ini, sell1 = 0;
int buy2 = ini, sell2 = 0;
for(int i=1; i<prices.size(); i++){
buy1 = max(buy1, -prices[i]);
sell1 = max(sell1, buy1+prices[i]);
buy2 = max(buy2, sell1-prices[i]);
sell2 = max(sell2, buy2+prices[i]);
}
return sell2;
}
};/* 71% **/
2021/01/09

浙公网安备 33010602011771号