动态规划- leecode 122
Problem: 122. 买卖股票的最佳时机 II
思路
仍然是一道比较简单的动态规划,但是一上手做还是没理清楚状态是什么。一天的状态只有两种,持有股票和没有股票,这样就可以列出状态转移方程
解题方法
开dp[n][2]的数组,dp[i][0]表示没有股票, dp[i][1]表示有股票,这里和背包不同的是需要注意dp[i-1][0]到dp[i][1]需要-price[i],反过来需要+price[i]
复杂度
时间复杂度:
空间复杂度:
Code
//这里是第一种解法 class Solution { public: int maxProfit(vector<int>& prices) { int n=prices.size(); int dp[n][2]; dp[0][0]=0; dp[0][1]=-prices[0]; for (size_t 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]); } return dp[n-1][0]; } }; //这里稍作优化,其实可以发现动态规划中这一行的数据只和上一行有关系,所以直接省略之前的储存 class Solution { public: int maxProfit(vector<int>& prices) { int n=prices.size(); int precash=0,prestock=-prices[0]; int cash=0,stock=0; for (size_t i = 1; i < n; i++) { cash=max(precash,prestock+prices[i]); stock=max(prestock,precash-prices[i]); precash=cash; prestock=stock; } return cash; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理