「经典题目回顾」贪心算法:买卖股票的最佳时机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>(20));
        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的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法 -- 122. 买卖股票的最佳时机 II

Leetcode122. 买卖股票的最佳时机 II(四行贪心代码)

492,动态规划和贪心算法解买卖股票的最佳时机 II

47.贪心算法之三:如果可以预知未来,股票最佳买卖时机问题

LeetCode 122. 买卖股票的最优时机 II

代码随想录算法训练营第四十九天| 121 买卖股票的最佳时机 122 买卖股票的最佳时机II