买卖股票的最佳时机1
只能买卖一次
买卖股票的最佳时机2
可以买卖任意次,但同时只能持有一只股票
把所有上坡加起来就行
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
int buy = prices[0];
int sell = 0;
for(int i = 1; i < len; i++){
/*if(prices[i] > buy){
sell += prices[i] - buy;
}
buy = prices[i];*/
if(prices[i] > price[i-1]){
sell += prices[i] - price[i-1];
}
}
return sell;
}
};
动态规划
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
int dp[len][2];
dp[0][0] = 0, dp[0][1] = -prices[0];
for(int i = 1; i < len; i++){
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);
}
return dp[len-1][0];
}
};
买卖股票的最佳时机3
最多卖两次,不能持有超过一支股票
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
int buy1 = -prices[0];
int sell1 = 0;
int buy2 = -prices[0];
int sell2 = 0;
for(int i = 1; i < len; 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;
}
};
这里不会出现sell2小于sell1,因为在这个代码里是允许当天买卖的,并且当天买卖的收益为0。
买卖股票的最佳时机4
最多买卖k次
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int m = prices.size();
vector<int> buy(k+1, INT_MIN);
vector<int> sell(k+1, 0);
for(int i = 0; i < m; i++){
for(int j = 1; j <= k; j++){
buy[j] = max(buy[j], sell[j-1] - prices[i]);
sell[j] = max(sell[j], buy[j] + prices[i]);
}
}
return sell[k];
}
};