- 买卖股票的最佳时机 II
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
方法一、贪心
由于买卖次数不受限制,而且没有代价,所有只需要使区间获利大于0,就可以进行交易
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans = 0;
for (int i = 0; i < prices.size()-1; i++){
int temp = prices[i+1] - prices[i];
if(temp > 0){
ans += temp;
}
}
return ans;
}
};
方法二、动态规划
状态:
在一天内有2种状态,
dp[i][0]——当天结束时不持有股票
dp[i][1]——当天结束时持有股票
初始化:
第一天,dp[0][0]=0,dp[0][1]=-prices[0]
更新:
依然分为2种情况,分别对两种状体进行更新
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]);
class Solution {
public:
int maxProfit(vector<int>& prices) {
int dp[prices.size()][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1; i < prices.size(); 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[prices.size()-1][0];
}
};