小松建设官方网站,上传网站需要什么软件,学校网站建设可行性分析,1688网站登录Leetcode: 121 买卖股票的最佳时机
代码随想录
1、确定下标和含义
dp[i][0]表示当天持有股票所得的最多现金
do[i][1]表示当天不持有股票的最多现金
2、递推公式
#xff08;1#xff09;如果第i天持有股票即dp[i][0]#xff0c; 那么可以由两个状态推出来
第i-1天就… Leetcode: 121 买卖股票的最佳时机
代码随想录
1、确定下标和含义
dp[i][0]表示当天持有股票所得的最多现金
do[i][1]表示当天不持有股票的最多现金
2、递推公式
1如果第i天持有股票即dp[i][0] 那么可以由两个状态推出来
第i-1天就持有股票那么就保持现状所得现金就是昨天持有股票的所得现金 即dp[i - 1][0]第i天买入股票所得现金就是买入今天的股票后所得现金即-prices[i]
那么dp[i][0]应该选所得现金最大的所以dp[i][0] max(dp[i - 1][0], -prices[i]);
2如果第i天不持有股票即dp[i][1] 也可以由两个状态推出来
第i-1天就不持有股票那么就保持现状所得现金就是昨天不持有股票的所得现金 即dp[i - 1][1]
第i天卖出股票所得现金就是按照今天股票价格卖出后所得现金即prices[i] dp[i - 1][0]
同样dp[i][1]取最大的dp[i][1] max(dp[i - 1][1], prices[i] dp[i - 1][0]);
3、初始化
dp[0][0]表示第0天持有股票此时的持有股票就一定是买入股票了所以dp[0][0] - prices[0];
dp[0][1]表示第0天不持有股票不持有股票那么现金就是0所以dp[0][1] 0;
时间复杂度O(n)
空间复杂度O(n)
class Solution {
public:int maxProfit(vectorint prices) {int len prices.size();if(len 0) return 0;vectorvectorint dp(len, vectorint(2));dp[0][0] - prices[0];dp[0][1] 0;for(int i 1; i len; i){dp[i][0] max(dp[i - 1][0], -prices[i]);dp[i][1] max(dp[i - 1][1], prices[i] dp[i - 1][0]);}return dp[len - 1][1];//最后肯定卖出}
};
Leetcode: 122 买卖股票的最佳时机II
与上题不同的是这道题可以反复卖出股票。
所以就体现在状态公式上
如果第i天持有股票即dp[i][0] 那么可以由两个状态推出来
第i-1天就持有股票那么所得现金就是昨天持有股票的所得现金 即dp[i - 1][0]第i天买入股票所得现金就是昨天不持有股票的所得现金减去今天的股票价格 即dp[i - 1][1] - prices[i]
2如果第i天不持有股票即dp[i][1]的情况 依然可以由两个状态推出来
第i-1天就不持有股票那么所得现金就是昨天不持有股票的所得现金 即dp[i - 1][1]第i天卖出股票所得现金就是按照今天股票价格卖出后所得现金即prices[i] dp[i - 1][0]
时间复杂度O(n)
空间复杂度O(n)
class Solution {
public:int maxProfit(vectorint prices) {int len prices.size();vectorvectorint dp(len, vectorint(2, 0));dp[0][0] - prices[0];dp[0][1] 0;for (int i 1; i len; i) {dp[i][0] max(dp[i - 1][0], dp[i - 1][1] - prices[i]); // 注意这里是和121. 买卖股票的最佳时机唯一不同的地方。dp[i][1] max(dp[i - 1][1], dp[i - 1][0] prices[i]);}return dp[len - 1][1];}
};
之前我们用贪心的方法做过这道题所以可以回顾一下。