[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目:

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

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

返回 你能获得的 最大 利润

  1. 初始化:
    • 如果数组长度小于等于1,直接返回0(无法获利)
    • hold = -prices:第一天买入股票,利润为负
    • notHold = 0:第一天不买股票,利润为0
  2. 遍历每一天(从第二天开始):
    • 更新 hold[i]
      hold[i] = Math.max(hold[i - 1], notHold[i - 1] - prices[i])
      意味着今天持有股票的最大利润可能来自:
      • 昨天就持有股票(hold[i - 1]
      • 昨天不持有,今天买入(notHold[i - 1] - prices[i]
    • 更新 notHold[i]
      notHold[i] = Math.max(notHold[i - 1], hold[i - 1] + prices[i])
      意味着今天不持有股票的最大利润可能来自:
      • 昨天就不持有股票(notHold[i - 1]
      • 昨天持有,今天卖出(hold[i - 1] + prices[i]
java 复制代码
public class no_122 {
    public static void main(String[] args) {
        int[] price = {1, 2, 3, 4, 5};
        System.out.println(maxProfit(price));
    }

    public static int maxProfit(int[] prices) {
        int n = prices.length;
        if (n <= 1) return 0;

        int[] hold = new int[n];
        int[] notHold = new int[n];

        hold[0] = -prices[0];
        notHold[0] = 0;

        for (int i = 1; i < n; i++) {
            //  今天持有股票的最大利润 = max(昨天持有,昨天不持有今天买入)
            hold[i] = Math.max(hold[i - 1], notHold[i - 1] - prices[i]);

            //  今天不持有股票的最大利润 = max(昨天就不持有, 昨天持有今天卖出)
            notHold[i] = Math.max(notHold[i - 1], hold[i - 1] + prices[i]);

        }
        return notHold[n - 1];

    }
}
相关推荐
Jim-2ha03 分钟前
【LeetCode 0102】【BSF】二叉树的层级遍历
算法·leetcode·职场和发展
小丁爱养花19 分钟前
数据结构(Java):队列&Queue集合&力扣面试OJ题
java·开发语言·数据结构·算法·leetcode·面试
清酒。2332 小时前
212.贪心算法:跳跃游戏(力扣)
leetcode·游戏·贪心算法
续亮~2 小时前
7、Redis 队列与 Stream
数据结构·数据库·redis·缓存·哈希算法
明湖底的炼丹炉4 小时前
混合贪心算法求解地铁线路调度
算法·贪心算法
云边有个稻草人6 小时前
【C语言】自定义类型:联合和枚举
c语言·开发语言·算法
hummhumm7 小时前
数据结构第18节 散列表 - 应用
java·数据结构·spring boot·spring cloud·java-ee·maven·散列表
sunny-ll7 小时前
【C++】继承最全解析(什么是继承?继承有什么用?)
c语言·开发语言·数据结构·c++·算法·青少年编程
Tina聊编程7 小时前
2024C++信息素养大赛-算法创意实践挑战_复赛真题(广东省)题目+参考答案和详细解析
c++·算法·青少年编程·白名单竞赛
是小满满满满吗7 小时前
类和对象(初)
数据结构·算法