「经典题目回顾」贪心算法:买卖股票的最佳时机II
Posted 代码随想录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「经典题目回顾」贪心算法:买卖股票的最佳时机II相关的知识,希望对你有一定的参考价值。
春节前的最后一个周末,明天还是工作日,哈哈,我们来复习一下贪心算法吧!
贪心经常被大多数同学忽略的算法,都感觉贪心嘛,不就是常识,有啥可学的。
贪心其实是很难的,难就难在没有套路,是的,贪心无套路!
动态规划我能总结出动规五部曲,二叉树我们总结出递归三部曲,回溯算法我也能总结出回溯三部曲。
但贪心真的总结不出来什么规律,题目往往巧的出其不意。
来回顾一下这道题
如果想到其实最终利润是可以分解的,那么本题就很容易了!
局部最优:收集每天的正利润,全局最优:求得最大利润。
贪心代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
result += max(prices[i] - prices[i - 1], 0);
}
return result;
}
};
-
时间复杂度O(n) -
空间复杂度O(1)
贪心的代码很简单,而且比动规的解法更优!
动规代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
// dp[i][1]第i天持有的最多现金
// dp[i][0]第i天持有股票后的最多现金
int n = prices.size();
vector<vector<int>> dp(n, vector<int>(2, 0));
dp[0][0] -= prices[0]; // 持股票
for (int i = 1; i < n; i++) {
// 第i天持股票所剩最多现金 = max(第i-1天持股票所剩现金, 第i-1天持现金-买第i天的股票)
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
// 第i天持有最多现金 = max(第i-1天持有的最多现金,第i-1天持有股票的最多现金+第i天卖出股票)
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
return max(dp[n - 1][0], dp[n - 1][1]);
}
};
-
时间复杂度O(n) -
空间复杂度O(n)
股票问题在动态规划专题里我还会专门讲解的,敬请期待!
最后,录友们周末愉快!
组队刷题可以加我微信,备注:简单自我介绍 + 组队刷题
以上是关于「经典题目回顾」贪心算法:买卖股票的最佳时机II的主要内容,如果未能解决你的问题,请参考以下文章