121. 买卖股票的最佳时机
难度:简单。
标签:数组,动态规划。
正确解法:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int minPrice = prices[0];
int ans = 0;
for(int i = 1; i < prices.size(); ++i){
ans = max(ans, prices[i] - minPrice);
minPrice = min(minPrice, prices[i]);
}
return ans;
}
};
结果:
122. 买卖股票的最佳时机 II
难度:简单。
标签:贪心,数组,动态规划。
正确解法:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int minPrice = prices[0];
int ans = 0;
for(int i = 1; i < prices.size(); ++i){
if(prices[i] > minPrice){
ans += prices[i] - minPrice;
minPrice = prices[i];
}
else{
minPrice = min(minPrice, prices[i]);
}
}
return ans;
}
};
结果:
123. 买卖股票的最佳时机 III
难度:简单。
标签:数组,动态规划。
顺着上面的思路写。
遍历两次数组,第一次计算dp,dp[i]表示到第i天为止,进行一次交易获得的最大收益。
第二次从后往前遍历数组,将最大值记录下来,即为卖出的价格。则maxPrice - prices[i] + dp[i]为第二次交易在第i天买入获得的最大收益,遍历i,找到最大值即可。
正确解法:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> dp(n, 0);
int minPrice = prices[0];
int maxP1 = 0;
for(int i = 1; i < n; ++i){
dp[i] = max(max(0, prices[i] - minPrice), maxP1);
minPrice = min(minPrice, prices[i]);
maxP1 = max(dp[i], maxP1);
}
int maxPrice = prices[n - 1];
int ans = 0;
for(int i = n - 2; i >= 0; --i){
ans = max(ans, maxPrice - prices[i] + dp[i]);
maxPrice = max(maxPrice, prices[i]);
}
return ans;
}
};
结果: