代码随想录算法训练营day50 | 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

news2024/12/23 13:29:47

代码随想录算法训练营day50 | 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

  • 123.买卖股票的最佳时机III
    • 解法一:动态规划
  • 188.买卖股票的最佳时机IV
    • 解法一:动态规划
  • 总结


123.买卖股票的最佳时机III

教程视频:https://www.bilibili.com/video/BV1WG411K7AR
在这里插入图片描述
在这里插入图片描述

解法一:动态规划

思路:
1、dp[i][j]含义:第 i 天j状态下手中的最大金额。这个过程中一共有五个状态:0表示不曾持有;1表示第一次持有;2表示曾持有一次,当前不持有;3表示第二次持有;4表示曾持有两次,当前不持有。
2、递推公式:
dp[i][0]=dp[i-1][0];
dp[i][1]=Math.max(dp[i-1][1], dp[i-1][0]-prices[i]);
dp[i][2]=Math.max(dp[i-1][2], dp[i-1][1]+prices[i]);
dp[i][3]=Math.max(dp[i-1][3], dp[i-1][2]-prices[i]);
dp[i][4]=Math.max(dp[i-1][4], dp[i-1][3]+prices[i]);
3、初始化:dp[0]=new int[]{0, -prices[0], 0, -prices[0], 0};
4、遍历顺序:当前状态由前一状态推导而来,正向遍历。
5、打印验证

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        int[][] dp = new int[len][5];

        //初始化,dp[i][0],dp[i][3]和dp[i][4]都为0,不需要显示初始化
        dp[0][1] = -prices[0];
        dp[0][3] = -prices[0];

        for(int i=1;i<len;i++){
            dp[i][0]=dp[i-1][0];
            dp[i][1]=Math.max(dp[i-1][1], dp[i-1][0]-prices[i]);
            dp[i][2]=Math.max(dp[i-1][2], dp[i-1][1]+prices[i]);
            dp[i][3]=Math.max(dp[i-1][3], dp[i-1][2]-prices[i]);
            dp[i][4]=Math.max(dp[i-1][4], dp[i-1][3]+prices[i]);
        }
        return dp[len-1][4];//dp[i][4]包含了dp[i][2]的结果
    }
}

//空间优化
class Solution {
    public int maxProfit(int[] prices) {
        int[] dp = new int[4]; 
        // 存储两次交易的状态就行了
        dp[0] = -prices[0];// dp[0]代表第一次持有
        dp[1] = 0;// dp[1]代表第一次不持有
        dp[2] = -prices[0];// dp[2]代表第二次持有
        dp[3] = 0;// dp[3]代表第二次不持有

        for(int i = 1; i <= prices.length; i++){
            // 要么保持不变,要么没有就买,有了就卖
            dp[0] = Math.max(dp[0], 0-prices[i-1]);
            dp[1] = Math.max(dp[1], dp[0]+prices[i-1]);
            dp[2] = Math.max(dp[2], dp[1]-prices[i-1]);
            dp[3] = Math.max(dp[3], dp[2]+ prices[i-1]);
        }
        return dp[3];
    }
}

188.买卖股票的最佳时机IV

教程视频:https://www.bilibili.com/video/BV16M411U7XJ
在这里插入图片描述
在这里插入图片描述

解法一:动态规划

思路:
1、dp[i][j]含义:第 i 天j状态下手中的最大金额。这个过程中一共有2k个状态:不操作状态不记录;0表示第一次持有;1表示曾持有一次,当前不持有;2表示第二次持有;3表示曾持有两次,当前不持有;以此类推直至2k-1。
2、递推公式:
dp[i][0]=Math.max(dp[i-1][0], 0-prices[i]);
dp[i][1]=Math.max(dp[i-1][1], dp[i-1][0]+prices[i]);
dp[i][2]=Math.max(dp[i-1][2], dp[i-1][1]-prices[i]);
dp[i][3]=Math.max(dp[i-1][3], dp[i-1][2]+prices[i]);
直到dp[i][2k-1]=Math.max(dp[i-1][2k-1], dp[i-1][2*k-2]+prices[i]);
3、初始化:dp[0][]={0, -prices[0], 0, -prices[0], 0,…};
4、遍历顺序:当前状态由前一状态推导而来,正向遍历。
5、打印验证

class Solution {
    public int maxProfit(int k, int[] prices) {
        int len = prices.length;
        int[][] dp = new int[len][2*k];

        //初始化,dp[i][偶数j]表示持有第(j/2)次持有股票
        //dp[i][奇数j]表示当前不持有股票,曾经持有(j/2)次股票,初始值为0,不需要显式初始化
        for(int j=0;j<2*k;j+=2){
            dp[0][j]=-prices[0];
        }

        for(int i=1;i<len;i++){
            for(int j=0;j<2*k;j++){
                if(j==0){
                    dp[i][j]=Math.max(dp[i-1][j], 0-prices[i]);
                }else if(j%2==0){
                    dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-1]-prices[i]);
                }else{
                    dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-1]+prices[i]);
                }
                // System.out.print(dp[i][j]+"\t");
            }
            // System.out.println("");
        }
        return dp[len-1][2*k-1];
    }
}

总结

确定第i天有几个状态即可。这基础上可以空间优化,仅维护前一天的状态即可。

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

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

相关文章

【NovelAI 小说SD批量生成 视频克隆】环境配置和使用方法

【样品】《我在东北立堂口》图生图半自动版SD一键成片 操作步骤&环境配置地址&#xff1a; 【NovelAI】月产10000全自动批量原创小说短视频支持文生图和视频克隆 该文章面向购买脚本的付费用户&#xff0c;提供所有问题以及解决办法。使用 notepad 打开对应的文件即可&…

光敏晶体管(ALS-PT19-315C/L177/TR8) 光照度和电压,电流关系分析.

背景 当我们使用光敏晶体管进行,测算光照度时,大多使用ADC电路测到电压. 那么怎么根据这个电压计算出对应具体的光照度呢? 下面将以 ALS-PT19-315C/L177/TR8 型号的 光敏晶体管为例,来进行分析介绍,并给出 如何根据最大光照度范围 选定合适的电阻和电容. 1,直接看数据手册给…

如何快速录制电脑屏幕?教您一键录屏的3种方法!

案例&#xff1a;如何快速录制电脑屏幕&#xff1f; 【打开录屏工具录制电脑屏幕&#xff0c;需要耗费一定的时间。有没有方法可以快速打开电脑录屏工具&#xff0c;实现一键录屏&#xff1f;】 随着互联网的发展和普及&#xff0c;电脑屏幕录制已经成为了一项必要的工作技能…

R语言实践——rWCVP入门

rWCVP入门 介绍1. 访问到WCVP1.1 方法一1.2 方法二&#xff08;谨慎&#xff09; 2. WCVP数据筛选2.1 关于按分类单元筛选的说明2.2 关于按分布区域筛选的说明 笔者实践 介绍 世界维管植物名录&#xff08;WCVP&#xff09;是维管植物物种的全球共识。它提供了科学已知的> …

Flink用户自定义连接器(Table API Connectors)学习总结

文章目录 前言背景官网文档概述元数据解析器运行时的实现 自定义扩展点工厂类Source扩展Sink和编码与解码 自定义flink-http-connectorSQL示例具体代码pom依赖HttpTableFactoryHttpTableSourceHttpSourceFunctionHttpClientUtil 最后参考资料 前言 结合官网文档和自定义实现一…

Leetcode | 1534 统计好三元组

1534 统计好三元组 文章目录 [1534 统计好三元组](https://leetcode.cn/problems/count-good-triplets/description/)题目解法1 暴力穷举解法2 枚举优化 题目 给你一个整数数组 arr &#xff0c;以及 a、b 、c 三个整数。请你统计其中好三元组的数量。 如果三元组 (arr[i], a…

怎么把录音转文字?推荐你这三款工具

随着科技不断发展&#xff0c;录音转文字的技术也逐渐被广泛应用于各种场景中。其中最常见的一种就是会议记录。在日常工作中&#xff0c;会议是企业和组织中必不可少的一个环节&#xff0c;但在会议过程中的录音和记录往往需要花费大量的时间和精力。这个时候&#xff0c;我们…

【AI聊天丨 ChatGPT应用案例一】— 仅用30分钟,ChatGPT帮你完成专利交底书!

Hi&#xff0c;大家好&#xff0c;我是零点壹客&#xff0c;今天主要也是想和大家一起唠唠ChatGPT&#xff0c; 尤其这两个月&#xff0c;ChatGPT出奇的火&#xff0c;想必各位圈友们或多或少的都已经有些了解。 ChatGPT的出现很大程度上已经改变了我们的工作方式&#xff0c;尤…

GPT4限制被破解!ChatGPT实现超长文本处理的新方法

目录 前言 使用chat-gpt过程中有哪些痛点 1.无法理解人类情感和主观性 2.上下文丢失 3.约定被打断 那如何去解决这个痛点 Transformer&#xff08;RMT&#xff09;怎么去实现的 1.Transformer 模型 2.RMT模型 3.计算推理速率 4.渐进学习能力 总结 写到最后 大家好…

DeepPyramid:在白内障手术视频中实现金字塔视图和可变形金字塔接收的语义分割

文章目录 DeepPyramid: Enabling Pyramid View and Deformable Pyramid Reception for Semantic Segmentation in Cataract Surgery Videos摘要本文方法模块细节 实验结果 DeepPyramid: Enabling Pyramid View and Deformable Pyramid Reception for Semantic Segmentation in …

探秘 | 简说IP地址以及路由器的功能究竟是什么?

我们都知道我们在上网的时候都有一个IP地址&#xff0c;用来和其他人进行通信和数据交换。 其中IP地址又分为内网地址和外网地址&#xff0c;也叫作私有地址和公有地址。 为什么要区分私有地址和公有地址呢&#xff1f;原因很简单&#xff0c;因为公有的IP地址不够使用了&…

UnityVR--组件4--Ray/Raycast/Linecast/OverlapSphere

目录 Ray/Raycast/Linecast//OverlapSphere简介 Ray类 Physics.Raycast方法 应用1&#xff1a;实现鼠标点击出射线并检测物体 应用2&#xff1a;实现鼠标点击拖拽物体 Physics.Linecast和Physics.OverlapSphere 应用3&#xff1a;进入范围时触发攻击 Ray/Raycast/Lineca…

day13 网络编程Tomcat服务器

c/s架构和b/s架构的区别 c/s架构:客户端软件,直观,体验好,界面美观,安全性高 b/s架构:浏览器–>服务器,可移植性好,开发和维护性好 网络访问的三要素:ip,端口,协议 udp协议和tcp协议的区别 udp协议:只管发送,不管发送到哪里,是否能不能接收,一对多,无连接通信协议 ​ …

蓝桥:前端开发笔面必刷题——Day3 数组(三)

文章目录 &#x1f4cb;前言&#x1f3af;两数之和 II&#x1f4da;题目内容✅解答 &#x1f3af;移除元素&#x1f4da;题目内容✅解答 &#x1f3af;有序数组的平方&#x1f4da;题目内容✅解答 &#x1f3af;三数之和&#x1f4da;题目内容✅解答 &#x1f4dd;最后 &#x…

混沌演练实践(二)-支付加挂链路演练 | 京东云技术团队

1. 背景 当前微服务架构下&#xff0c;各个服务间依赖高&#xff0c;调用关系复杂&#xff0c;业务场景很少可以通过一个系统来实现&#xff0c;常见的业务场景实现基本涉及多个上下游系统&#xff0c;要保证整体链路的稳定性&#xff0c;需要尽量减少系统之间的耦合性&#x…

Elasticsearch与Clickhouse数据存储对比 | 京东云技术团队

1 背景 京喜达技术部在社区团购场景下采用JDQFlinkElasticsearch架构来打造实时数据报表。随着业务的发展Elasticsearch开始暴露出一些弊端&#xff0c;不适合大批量的数据查询&#xff0c;高频次分页导出导致宕机、存储成本较高。 Elasticsearch的查询语句维护成本较高、在聚…

CloudBase CMS的开发注意事项

引言 在进行基于云开发的微信小程序开发时为了减轻工作量打算用CloudBase CMS来减轻工作量&#xff0c;随后去了解并体验了CloudBase CMS的使用&#xff0c;总体来说还有些许问题没有解决&#xff0c;对减轻后台管理工作并没有起到很大的作用。 项目情景 使用CloudBase CMS来管…

Flutter 笔记 | Flutter 基础组件

Text Text 用于显示简单样式文本&#xff0c;它包含一些控制文本显示样式的一些属性&#xff0c;一个简单的例子如下&#xff1a; Text("Hello world",textAlign: TextAlign.left, );Text("Hello world! Im Jack. "*4,maxLines: 1,overflow: TextOverflo…

HACKABLE: III

文章目录 HACKABLE: III实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、查看网站源码4、扫描目录5、访问网址6、查看并下载7、访问网站8、查看文件9、解密10、访问网站11、访问网站12、查看文件13、解密14、访问网站15、访问网站16、下载图片17、隐写1…

tcp连接阿里云linux服务器失败

原因&#xff1a; 自己程序bind的是127.0.0.1 应该改成 bind 阿里云的私网地址 client连接的是阿里云公网地址 参考&#xff1a; 阿里云服务器&#xff0c;客户端socket无法连接的问题 - 爱码网 排查过程记录&#xff1a; 1&#xff0c;安全组设置&#xff1a;有正常设置…