LeetCode122 买卖股票的最佳时机 II 贪心算法

题目链接 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。 总利润为 4 + 3 = 7 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
总利润为 4 。

分析题意

作为炒股人士,第一次拿到这道题,思维上要适应一会儿,因为题目跟现实中的炒股不同。

  1. 题目预先知道每天的股价,由此能全局规划,而实际股市中不可能
  2. 题目限制 “你在任何时候 最多 只能持有 一股 股票”。prices[i] 是每一股的价格,按题目的意思,不能连续买买买(遇到连续低价不能加仓),手上持有股票的话,只能先卖掉再购入。禁止了连续低价买进,然后等到一个最高的prices[i] 售出的行为。这不同于实际炒股,如果遇到连续低价,股迷朋友可能疯狂加仓,然后高位抛售。

贪心算法

贪心算法的直觉:由于不限制交易次数,只要今天股价比昨天高,就交易。

这道题 「贪心」 的地方在于,对于 「今天的股价 - 昨天的股价」,得到的结果有 3 种可能:① 正数,② 0,③负数。贪心算法的决策是: 只加正数

public class Solution {

    public int maxProfit(int[] prices) {
        int len = prices.length;
        if (len < 2) {
            return 0;
        }

        int res = 0;
        for (int i = 1; i < len; i++) {
            int diff = prices[i] - prices[i - 1];
            if (diff > 0) {
                res += diff;
            }
        }
        return res;
    }
}

需要说明的是,贪心算法仅代表计算过程,用于计算最大利润,计算的过程并不是实际的交易过程

下面说明等价性:以 [1, 2, 3, 4] 为例,这 4 天的股价依次上升,按照贪心算法,得到的最大利润是:

res = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])
= prices[3] - prices[0]

但是实际的交易过程并不是进行 4 次买入和 4 次卖出,而是在第 1 天买入,第 5 天卖出。

贪心算法“计算的过程并不是真正交易的过程”,计算的过程像“昨天买今天卖”,对于递增数组,多次“昨天买今天卖”的操作等价于第一天买入,最后一天卖出。对于递减数组,一直都不操作(因为收益是负数),对于低-高-低-高的数组,只要保持 低吸高抛 ,最终利润最大。

在这里插入图片描述

希望对你有帮助

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值