leetcode 121. 买卖股票的最佳时机 (贪心 + 动规

这篇具有很好参考价值的文章主要介绍了leetcode 121. 买卖股票的最佳时机 (贪心 + 动规。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

贪心的思路:

得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的

class Solution {
public:
    int maxProfit(vector<int>& prices) {

       // 贪心: 找到最小的,然后逐个减掉最小的,取最终值为最大的为 res 
       int low = INT_MAX;
       int res = 0;
       for(int i = 0; i < prices.size(); i++)
       {
           low = min(prices[i], low);
           res = max(res, prices[i] - low);
       }

       return res;
    }
};

动规的思路:

现在觉得做动规的关键点就是找出,当前的状态是否与之前的状态有关,也就是说:当前一般会有两种状态,具体哪一种为最优,需要依靠之前的状态及逆行推导。

比如说本题

当天有两种状态:持有股票,和不持有股票。(这里没有使用买入、卖出作为含义是因为:单纯的买入,卖出,无法表示出更确切的状态。比如说前一天买入,后一天不进行任何操作,那么这个不进行操作的状态就无法表示了

1. dp数组的表示含义

        这里使用二维数组的原因是因为,一个维度表示天数,一个维度表示股票的状态

        dp [ i ] [ 0 ] 表示第 i 天持有股票,值为:所获得的利润

        dp [ i ] [ 1 ] 表示第 i 天不持有股票, 值为:所获得的利润

2. 递推公式

持有股票:

        第 i 天买入的: -price[ i ]

        第 i 天之前就买入了:dp[ i  - 1][ 0 ]

两者取最大值

不持有股票:

        第 i 天卖出: dp [ i - 1][ 0 ] + price[ i ]

        第 i 天之前就卖出了: dp [ i - 1 ][ 1 ]

两者取最大值

3. 初始化

dp[ 0 ] [ 0 ] =  - price[ 0 ]

dp[ 0 ] [ 1 ] = 0

4. 遍历顺序,从前向后

注意:

这里最终求的其实就是

dp [ price.size() - 1] [ 1 ]

因为最后一定是手里没有股票的利润会更大

class Solution {
public:
    int maxProfit(vector<int>& prices) {

        vector<vector<int>> dp(prices.size(), vector<int>(2));
        
        // 初始化
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        
        // 遍历 + 递推
        for(int i = 1; i < prices.size(); i++)
        {
            dp[i][0] = max(dp[i - 1][0], -prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }

        return dp[prices.size() - 1][1];
    }
};

3. 双指针

一个指向前一天,一个指向当天,这样就保证只会在买入后卖出,找出利润最大的文章来源地址https://www.toymoban.com/news/detail-432588.html

class Solution {
public:
    int maxProfit(vector<int>& prices) {
       // 双指针

       int left = 0 ,right = 1;
       int res = 0;
       for(; right < prices.size();)
       {
           int x = prices[right] - prices[left];
           if(x > 0)   // 不断移动  right,继续寻找更大的利润
           {
               res = max(res, x);
               right++;
           } 
           else   //如果利润为负数 让 left 尽可能小,然后移动一次right 
           {
               left = right; // 注意这里是直接移动到right , 让 left 处于尽可能小的位置
               right++;
           } 
       }
       return res;
    }
};

到了这里,关于leetcode 121. 买卖股票的最佳时机 (贪心 + 动规的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣(Leetcode) 121. 买卖股票的最佳时机

    给定一个数组  prices  ,它的第  i  个元素  prices[i]  表示一支给定股票第  i  天的价格。 你只能选择  某一天  买入这只股票,并选择在  未来的某一个不同的日子  卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如

    2024年01月25日
    浏览(43)
  • LeetCode:121.买卖股票的最佳时机——动态规划

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 关于动态规划:LeetCode:322. 零钱兑换——动态规划从案例入门 题目描述 :给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只

    2023年04月17日
    浏览(42)
  • 121.买卖股票的最佳时机 122.买卖股票的最佳时机II

    力扣题目链接(opens new window) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最

    2024年01月17日
    浏览(41)
  • 算法刷题|121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ

    题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获

    2023年04月26日
    浏览(43)
  • 121. 买卖股票的最佳时机

    121. 买卖股票的最佳时机 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/

    2024年02月19日
    浏览(48)
  • 买卖股票的最佳时机【力扣121】

    假如我们要在第 i 天卖出股票,那么为了获得最大利润,买股票的最佳时间是第 i 天前的最低股价的那一天。 我们使用min来记录已经访问过的 0-i 天的最低股价。那么在第 i 天,如果股价大于min,那么最大利润为price[i]-min;否则最大利润为0,并且min=price[i]。

    2024年02月11日
    浏览(42)
  • 力扣 121. 买卖股票的最佳时机

    题目来源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久没写代码了,啥啥都忘了 C++题解1:贪心算法。(来源代码随想录) 因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。 时间复杂度:O(n) 空

    2024年02月20日
    浏览(35)
  • 算法训练第四十九天 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    题目链接:121.买卖股票的最佳时机 参考:https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html 视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一

    2024年02月01日
    浏览(40)
  • 贪心算法|122.买卖股票的最佳时机II

    力扣题目链接 贪心思路出来了,代码居然如此简单啊! 本题首先要清楚两点: 只有一只股票! 当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 #贪心算法 这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入.....循环反复

    2024年04月16日
    浏览(31)
  • 【DP】【贪心】122.买卖股票的最佳时机II

    题目 六种股票问题总结https://blog.csdn.net/weixin_47692079/article/details/117202705

    2024年01月19日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包