力扣-股票买入问题

news2025/7/16 22:42:07

dp

dp元素代表最大利润

f[j][1] 代表第 j 次交易后持有股票的最大利润。在初始状态,持有股票意味着你花钱买入了股票,此时的利润应该是负数(扣除了买入股票的成本),而不是 0。所以,把 f[j][1] 初始化为负无穷大

f[j][0] 表示第 j 次交易完成后未持有股票的最大利润。当还未开始进行任何有效的股票买卖操作时,也就是处于初始状态,此时没有持有股票且利润为 0 

所以有了如下初始化

for (int j = 0; j < k + 2; j++) {
            for (int l = 0; l < 2; l++) {
                f[j][l] = Double.NEGATIVE_INFINITY;
            }
        }
// 初始化状态,第 j 次交易未持有股票时利润为 0
 for (int j = 1; j < k + 2; j++) {
    f[j][0] = 0;
}

 

因为可以交易0~k次,一共k+1种选择,而i = 0时,状态转移会出现i=-1的dfs,所以要开辟k+2个空间,而我们实际填写k+1种

因为数组不能有-1的索引,所以整体偏移,用0代表-1,1代表0.所以j<0而不是j<=0

import java.util.List;

public class StockTrading {
    public int maxProfit(List<Integer> prices) {
        // 最多允许的交易次数
        int k = 2;
        // 初始化动态规划数组 f
        double[][] f = new double[k + 2][2];
        for (int j = 0; j < k + 2; j++) {
            for (int l = 0; l < 2; l++) {
                f[j][l] = Double.NEGATIVE_INFINITY;
            }
        }
        // 初始化状态,第 j 次交易未持有股票时利润为 0
        for (int j = 1; j < k + 2; j++) {
            f[j][0] = 0;
        }
        // 遍历每一天的股票价格
        for (int i = 0; i < prices.size(); i++) {
            int p = prices.get(i);
            // 从后往前更新状态
            for (int j = k + 1; j > 0; j--) {
                // 更新第 j 次交易未持有股票的最大利润
                f[j][0] = Math.max(f[j][0], f[j][1] + p);
                // 更新第 j 次交易持有股票的最大利润
                f[j][1] = Math.max(f[j][1], f[j - 1][0] - p);
            }
        }
        // 返回最终结果,即最后一次交易未持有股票的最大利润
        return (int) f[f.length - 1][0];
    }
}

有冷冻期

修改状态转移方程

因为卖出的股票不能是前一天买入的了,所以不能-1要用合理时间的股票  

交易次数必须为2

只需要不断维护两次交易的利润即可,不需要记录全部交易的利润

这里不用开辟k+2的空间了,因为规定必须交易两次,所以状态转移方程没有变量了,而是具体的1和2,就不会出现-1的情况

import java.util.List;

public class StockTrading {
    public int maxProfit(List<Integer> prices) {
        // 交易次数必须为2次
        int k = 2;

        // 初始化动态规划数组 f
        // f[j][0] 表示第 j 次交易未持有股票的最大利润
        // f[j][1] 表示第 j 次交易持有股票的最大利润
        int[][] f = new int[k + 1][2];

        // 初始化状态
        for (int j = 1; j <= k; j++) {
            f[j][0] = Integer.MIN_VALUE; // 初始时,未持有股票的利润为最小整数
            f[j][1] = Integer.MIN_VALUE; // 初始时,持有股票的利润为最小整数
        }
        f[0][0] = 0; // 第0次交易未持有股票的利润为0

        // 遍历每一天的股票价格
        for (int i = 0; i < prices.size(); i++) {
            int p = prices.get(i);

            // 更新第 2 次交易的状态
            f[2][0] = Math.max(f[2][0], f[2][1] + p); // 第 2 次交易未持有股票
            f[2][1] = Math.max(f[2][1], f[1][0] - p); // 第 2 次交易持有股票

            // 更新第 1 次交易的状态
            f[1][0] = Math.max(f[1][0], f[1][1] + p); // 第 1 次交易未持有股票
            f[1][1] = Math.max(f[1][1], -p); // 第 1 次交易持有股票
        }

        // 返回最终结果,即第 2 次交易未持有股票的最大利润
        // 如果无法完成两次交易,返回 0 或其他特殊值
        return Math.max(f[2][0], 0); // 确保不会返回负值
    }
}

网课:买卖股票的最佳时机【基础算法精讲 21】_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务保护:Sentinel

home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多&#xff0c;比如&#xff1a; 请求限流 线程隔离 服务熔断 服务故障最重要原因&#xff0c;就是并发太高&#xff01;解决了这个问题&#xff0c;就能避免大部分故障。当然&#xff0c;接口的并发…

蓝桥杯刷题周计划(第二周)

目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…

【C++】C++11部分

目录 一、列表初始化 1.1 {}初始化 1.2 initializer_list 二、变量类型推导 2.1 auto 2.2 decltype 三、STL中一些变化 3.1 新增容器 四、lambda表达式 4.1 C98中的一个例子 4.2 lambda表达式 4.3 函数对象与lambda表达式 五、包装器 5.1 function包装器 5.2 fu…

【分布式】聊聊分布式id实现方案和生产经验

对于分布式Id来说&#xff0c;在面试过程中也是高频面试题&#xff0c;所以主要针对分布式id实现方案进行详细分析下。 应用场景 对于无论是单机还是分布式系统来说&#xff0c;对于很多场景需要全局唯一ID&#xff0c; 数据库id唯一性日志traceId 可以方便找到日志链&#…

c#面试题整理6

1.String类能否被继承&#xff0c;为什么 可以看到String类的修饰符是sealed&#xff0c;即是密封类&#xff0c;故不可被继承 2.一个对象的方法是否只能由一个线程访问 不是&#xff0c;但是可通过同步机制&#xff0c;确保同一个时间只有一个线程访问 3.计算2*8&#xff…

简洁实用的3个免费wordpress主题

高端大气动态炫酷的免费企业官网wordpress主题 非常简洁的免费wordpress主题&#xff0c;安装简单、设置简单&#xff0c;几分钟就可以搭建好一个wordpress网站。 经典风格的免费wordpress主题 免费下载 https://www.fuyefa.com/wordpress

Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露

一&#xff1a;背景 1. 讲故事 前面跟大家分享过一篇 C# 调用 C代码引发非托管内存泄露 的文章&#xff0c;这是一个故意引发的正向泄露&#xff0c;这一篇我们从逆向的角度去洞察引发泄露的祸根代码&#xff0c;这东西如果在 windows 上还是很好处理的&#xff0c;很多人知道…

【HDLbits--counter】

HDLbits--counter 在IC设计中&#xff0c;counter是十分普遍和重要的设计内容&#xff1b; 题目&#xff1a;基础计数器 module top_module (input clk,input reset,output [9:0] q);always (posedge clk) beginif(reset) beginq < 0;end else beginif(q999) beginq < 0…

nvm 让 Node.js 版本切换更灵活

有很多小伙伴前端开发进程中&#xff0c;我们常常会遇到不同项目依赖不同版本 Node.js 的情况。我们不可能去卸载重新安装适应的版本去安装依赖或者启动项目。为了避免版本冲突带来的一系列麻烦&#xff0c;在这里给大家推荐一款Node.js 版本管理工具——nvm&#xff08;Node V…

美畅物联丨P2P系列之STUN服务器:助力网络穿透

在当今WebRTC等实时通信应用广泛兴起的复杂网络环境下&#xff0c;如何在NAT&#xff08;网络地址转换&#xff09;环境中实现高效、稳定的点对点&#xff08;P2P&#xff09;连接成为关键。STUN&#xff08;Session Traversal Utilities for NAT&#xff09;服务器作为应对这一…

基于SpringBoot的“积分制零食自选销售平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“积分制零食自选销售平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 局部E-R图 系统首页界面…

DeepSeek-V3 技术报告解读

DeepSeek火了有一段时间了&#xff0c;春节假期因为没时间&#xff0c;所以关于deepseek大模型一系列的技术报告一直没看&#xff0c;新年开工后&#xff0c;抽一点时间把之前的坑补起来&#xff0c;关于DeepSeek-V3技术报告的解读已经有很多了&#xff0c;但我相信不同的人去读…

力扣72题编辑距离

题目 原理 三个操作对应的操作次数分别是: 插入:在原本的次数上 1删除:在原本的次数上1替换:如果两个位置的字符串一样,则等于原本的次数, 如果不等,在原本的次数上1 去三者的最小值,就是最小的编辑次数 示例 代码 答案是2 package org.example;public class _72_编辑距离 {pu…

聊天服务器分布式改造

目前的聊天室是单节点的&#xff0c;无论是http接口还是socket接口都在同一个进程&#xff0c;无法承受太多人同时在线&#xff0c;容灾性也非常差。因此&#xff0c;一个成熟的IM产品一定是做成分布式的&#xff0c;根据功能分模块&#xff0c;每个模块也使用多个节点并行部署…

linux上安装redis[从0到1]

redis安装步骤 1.下载redis2.新建redis文件夹3.解压安装Redis4.编译5.修改相关配置6.错误 redis下载官网: https://download.redis.io/releases/ 找到自己需要的版本 1.下载redis 选着自己需要下载的版本后&#xff0c;右击选择复制链接&#xff0c;然后利用命令进行下载&am…

批量删除 Excel 中的空白行、空白列以及空白表格

我们经常会碰到需要删除 Excel 文档表格中的空白行及空白列的场景&#xff0c;有一些空白行或空白列可能我们人工不好识别&#xff0c;因此删除空白行空白列对我们来讲就非常的繁琐&#xff0c;因为我们需要先识别哪些 Excel 文档中包含空白行或者空白列&#xff0c;我们才能够…

MYSQL之创建数据库和表

创建数据库db_ck &#xff08;下面的创建是最好的创建方法&#xff0c;如果数据库存在也不会报错&#xff0c;并且指定使用utf8mb4&#xff09; show databases命令可以查看所有的数据库名&#xff0c;可以找到刚刚创建的db_ck数据库 使用该数据库时&#xff0c;发现里面没有…

腾讯元宝:AI 时代的快速论文阅读助手

1. 背景与需求 在 AI 研究领域&#xff0c;每天都会涌现大量学术论文。如何高效阅读并提取关键信息成为研究者的一大难题。腾讯元宝是腾讯推出的一款大模型&#xff0c;结合了**大语言模型&#xff08;LLM&#xff09;和自然语言处理&#xff08;NLP&#xff09;**技术&#x…

重构谷粒商城09:人人开源框架的快速入门

谷粒商城09——人人开源框架的快速入门 前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶…

redis数据迁移教程(使用RedisShake实现不停机迁移十分便捷)

1.我的场景 需要把本地的redis数据上传到阿里云服务器上面,服务器上redis并没有开aof持久化,但是将rdb文件上传至服务器后每次重启redis,rdb文件会被覆盖导致无法同同步数据,最终决定使用RedisShake 2.RedisShake介绍 什么是 RedisShake​ RedisShake 是一个用于处理和迁移…