春节前的最后一个周末,明天还是工作日,哈哈,我们来复习一下贪心算法吧!
贪心经常被大多数同学忽略的算法,都感觉贪心嘛,不就是常识,有啥可学的。
贪心其实是很难的,难就难在没有套路,是的,贪心无套路!
动态规划我能总结出动规五部曲,二叉树我们总结出递归三部曲,回溯算法我也能总结出回溯三部曲。
但贪心真的总结不出来什么规律,题目往往巧的出其不意。
来回顾一下这道题贪心算法:买卖股票的最佳时机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;
}
};
贪心的代码很简单,而且比动规的解法更优!
动规代码如下:
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]);
}
};
股票问题在动态规划专题里我还会专门讲解的,敬请期待!