121. 买卖股票的最佳时机
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/submissions/
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> dp(n,0);
int min = prices[0];
dp[0] = prices[0];
int max_1 = 0;
for(int i = 1; i < n; i++)
{
dp[i] = max(prices[i] - min,0);
if(prices[i] < min)
{
min = prices[i];
}
if(dp[i] > max_1)
{
max_1 = dp[i];
}
}
return max_1;
}
};
代码二:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n,vector<int>(2,0));
dp[0][0] = -prices[0];//购买该股票
dp[0][1] = 0;
for(int i =1 ; i < n ;i ++)
{
dp[i][0] = max(-prices[i], dp[i-1][0]);
dp[i][1] = max(dp[i-1][0] + prices[i],dp[i-1][1]);
}
return dp[n-1][1];
}
};
dp[i][0] = max(-prices[i], dp[i-1][0]);
这句话是说 如果前一天购买了这个股票 今天还要购买这个股票 那当前的余额是不变的
因为只能购买一次 所以要么是前面购买 要么是今天购买
122.买卖股票的最佳时机II
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/submissions/
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>> dp(n,vector<int>(2,0));
dp[0][0] = -prices[0]; //持有该股票的金额最大
dp[0][1] = 0;
for(int i = 1 ; i < n; 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]);
}
if(dp[n-1][0] > dp[n-1][1])
return dp[n-1][0];
else
return dp[n-1][1];
}
};