首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >「经典题目回顾」贪心算法:买卖股票的最佳时机II

「经典题目回顾」贪心算法:买卖股票的最佳时机II

作者头像
代码随想录
发布2021-02-26 16:34:19
发布2021-02-26 16:34:19
35500
代码可运行
举报
文章被收录于专栏:代码随想录代码随想录
运行总次数:0
代码可运行

春节前的最后一个周末,明天还是工作日,哈哈,我们来复习一下贪心算法吧!

贪心经常被大多数同学忽略的算法,都感觉贪心嘛,不就是常识,有啥可学的。

贪心其实是很难的,难就难在没有套路,是的,贪心无套路!

动态规划我能总结出动规五部曲,二叉树我们总结出递归三部曲,回溯算法我也能总结出回溯三部曲。

但贪心真的总结不出来什么规律,题目往往巧的出其不意。

来回顾一下这道题贪心算法:买卖股票的最佳时机II

如果想到其实最终利润是可以分解的,那么本题就很容易了!

局部最优:收集每天的正利润,全局最优:求得最大利润。

贪心代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
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)

贪心的代码很简单,而且比动规的解法更优!

动规代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
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)

股票问题在动态规划专题里我还会专门讲解的,敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码随想录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档