当前位置: 首页 > news >正文

第九章 动态规划 part11 123. 买卖股票的最佳时机III 188. 买卖股票的最佳时机IV

第五十天| 第九章 动态规划 part11 123. 买卖股票的最佳时机III 188. 买卖股票的最佳时机IV

一、123. 买卖股票的最佳时机III==(难难难难难)==

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

  • 题目介绍:

    • 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

      设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易

      **注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

      示例 1:

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

    • 注意:本题是最多买卖两次股票

    • DP五部曲:

      • (1)确定dp数组及下标含义:

        • 一天一共就有五个状态,

          1. 没有操作 (其实我们也可以不设置这个状态)
          2. 第一次持有股票
          3. 第一次不持有股票
          4. 第二次持有股票
          5. 第二次不持有股票
        • dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。
          
        • 五个状态分别如下:

          • dp[i][0]: 表示第i天,不操作股票的时候,手中的最大金额(也就是0)
            dp[i][1]: 表示第i天,第一次持有该股票,手中的最大金额
            dp[i][2]: 表示第i天,第一次不持有该股票,手中的最大金额
            dp[i][3]: 表示第i天,第二次持有该股票,手中的最大金额
            dp[i][4]: 表示第i天,第二次不持有该股票,手中最大的金额
            
      • (2)确定递推公式:

        • 和I、II一样的思路

        • 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数组:

        • dp[0][0] = 0;
          dp[0][1] = -prices[0];
          dp[0][2] = 0;
          dp[0][3] = -prices[0];
          dp[0][4] = 0;
          
        • 分别表示的含义是:
          (1)dp[0][0]:第0天,没有任何操作手里的金额是0
          (2)dp[0][1]:第0天,第一次持有股票,手里的金额就是买第0天的股票花掉的
          (3)dp[0][2]:第0天,第一次不持有股票,手里的金额就是买完再卖了第0天的股票,也就是0
          (4)dp[0][3]:为什么会出现第二次持有呢?可以当作第一天买了又卖了,然后再买
          (5)dp[0][4]:同理。
          
      • (4)确定遍历顺序:

        • 正序
      • (5)打印dp数组:

        • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • 代码:

class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.length == 0) return 0;// (1)确定dp数组及下标含义// dp[i][0]: 表示第i天,不操作股票的时候,手中的最大金额(也就是0)// dp[i][1]: 表示第i天,第一次持有该股票,手中的最大金额// dp[i][2]: 表示第i天,第一次不持有该股票,手中的最大金额// dp[i][3]: 表示第i天,第二次持有该股票,手中的最大金额// dp[i][4]: 表示第i天,第二次不持有该股票,手中最大的金额int[][] dp = new int[prices.length][5];// (3)初始化dp数组dp[0][1] = -prices[0];dp[0][3] = -prices[0];// (4)确定遍历顺序for (int i = 1; i < prices.length; i++) {// (2)确定递推公式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[prices.length-1][4];}
}
  • 注意:
    • 这里的返回值再强调一下:
      • 首先众所周知,你不持有股票手里的金额一定是大于持有股票的,所以返回的状态一定是偶数状态。
      • 那为什么不返回状态2呢?
        • 是因为状态4其实是包含了状态2的,因为如果状态2达到最大值,状态4一定会保持这个最大值的。因此直接返回状态4即可。

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

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

  • 题目介绍:

    • 给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。

      设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

      **注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

      示例 1:

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

    • 注意:本题是最多买卖k次股票
    • 根据上道题可以推算出本题,只需要把握一些关键的边界点即可
      • (1)dp数组的初始化长度:2k+1
      • (2)初始化dp数组:奇数状态初始为-prices[0],边界是< 2 * k
      • (3)递推公式:需要一个j表示状态,j从0开始,每次循环+2,因此到最后一位2k时,j=2k-2。因此j的边界是:j < 2k - 1;
  • 代码:

class Solution {public int maxProfit(int k, int[] prices) {if (prices == null || prices.length == 0) return 0;int[][] dp = new int[prices.length][2*k+1];for (int i = 1; i < 2*k; i += 2) {dp[0][i] = -prices[0];}for (int i = 1; i < prices.length; i++) {for (int j = 0; j < 2*k-1; j += 2) {dp[i][j + 1] = Math.max(dp[i-1][j+1], dp[i-1][j] - prices[i]);dp[i][j + 2] = Math.max(dp[i-1][j+2], dp[i-1][j+1] + prices[i]);}}return dp[prices.length - 1][2*k];}
}

相关文章:

第九章 动态规划 part11 123. 买卖股票的最佳时机III 188. 买卖股票的最佳时机IV

第五十天| 第九章 动态规划 part11 123. 买卖股票的最佳时机III 188. 买卖股票的最佳时机IV 一、123. 买卖股票的最佳时机III&#xff08;难难难难难&#xff09; 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 题目介绍&#xff…...

阿里云服务器共享型和企业级独享有什么区别?

阿里云ECS云服务器共享型和企业级有什么区别&#xff1f;企业级就是独享型&#xff0c;共享型和企业级云的主要区别CPU调度模式&#xff0c;共享型是非绑定CPU调度模式&#xff0c;企业级是固定CPU调度模式&#xff0c;共享型云服务器在高负载时计算性能可能出现波动不稳定&…...

Vue.js基本语法上

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.插值 1.1 文本 1.2 v-v-html 1.3 数据双向绑定数据(v-model) 1.4 属性&#xff…...

【1333. 餐厅过滤器】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个餐馆信息数组 restaurants&#xff0c;其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。 其中素食者友好过滤器 v…...

wifi7有关的210个提案

[1] TGbe, “Compendium of motions related to the contents of the TGbe specification framework document,” 19/1755r8, September 2020. [2] Bin Tian (Qualcomm), “Discussion on 11be PHY capabilities,” 20/0975r0, July 2020. [3] TGbe, “Compendiu…...

200行C++代码写一个Qt俄罗斯方块小游戏

小小演示一下&#xff1a; 大体思路&#xff1a; 其实很早就想写一个俄罗斯方块了&#xff0c;但是一想到那么多方块还要变形&#xff0c;还要判断落地什么的就脑壳疼。直到现在才写出来。 俄罗斯方块这个小游戏的小难点其实就一个&#xff0c;就是方块的变形&#xff0c;看似…...

蓝桥杯每日一题20223.9.26

4407. 扫雷 - AcWing题库 题目描述 分析 此题目使用map等都会超时&#xff0c;所以我们可以巧妙的使用哈希模拟散列表&#xff0c;哈希表初始化为-1首先将地雷读入哈希表&#xff0c;找到地雷的坐标在哈希表中对应的下标&#xff0c;如果没有则此地雷的位置第一次出现&#…...

查看基站后台信息

查看基站后台信息 电脑配置固定ip: 192.168.1.99: 打开“网络和共享中心”&#xff0c;选择更改适配器设置&#xff1a; 右键“本地连接”&#xff0c;选择属性 基站网线直连电脑网口 Telnet 登录基站 打开dos窗口 windows键R”&#xff0c;输入cmd&#xff0c;点确定&…...

关于坐标的旋转变换和坐标系的旋转变换

不管是坐标的旋转变换还是坐标系下的旋转变换&#xff0c;只和旋转的顺时针和逆时针有关。然坐标系间的顺时针和逆时针是根据当前坐标系在目标坐标系下的相对位置确定。 一。逆时针旋转belta角度的公式 二。顺时针旋转belta角度的公式 三。坐标的旋转变换 1.坐标的旋转变换相…...

2023.9.19 关于 数据链路层 和 DNS 协议 基本知识

目录 数据链路层 MTU DNS 协议 补充 DHCP协议 数据链路层 基本概念&#xff1a; 考虑相邻两个节点之间的传输&#xff08;通过 网线 / 光纤 / 无线 直接相连的两个设备&#xff09;以太网协议 规定了 数据链路层 和 物理层 的内容 IP地址 与 mac地址 的相互配合 IP地址 描…...

如何保证接口幂等性

简介 接口幂等性就是说用户使用相同的参数请求同一个接口无论是一次还是多次都应该是一样的。不会因为多次的点击产生不同效果。 举个栗子&#xff1a;一个用户在手机APP上提200块钱&#xff0c;然后一不小心点击了两次&#xff0c;那么就应该只提取出200块钱&#xff0c;不应…...

搭建智能桥梁,Amazon CodeWhisperer助您轻松编程

零&#xff1a;前言 随着时间的推移&#xff0c;人工智能技术以惊人的速度向前发展&#xff0c;正掀起着全新的编程范式革命。不仅仅局限于代码生成&#xff0c;智能编程助手等创新应用也进一步提升了开发效率和代码质量&#xff0c;极大地推动着软件开发领域的快速繁荣。 当前…...

数组和指针笔试题解析之【指针】

目录 &#x1f342;笔试题1&#xff1a; &#x1f342;笔试题2&#xff1a; &#x1f342;笔试题3&#xff1a; &#x1f342;笔试题4&#xff1a; &#x1f342;笔试题5&#xff1a; &#x1f342;笔试题6&#xff1a; &#x1f342;笔试题7&#xff1a; &#x1f342;笔试题…...

【Linux】之Centos7卸载KVM虚拟化服务

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…...

智能电力运维系统:数字化转型在电力行业的关键应用

随着信息技术、人工智能等的飞速发展&#xff0c;数字化改造已成为各行各业的重要发展趋势。在电力行业中&#xff0c;智能电力运维系统是数字化转型的关键应用之一。 力安科技智能电力运维系统是一种集自动化、智能化、云计算、物联网等先进技术于一体的电力运维管理解决方…...

eslint报错:no-empty-source

问题&#xff1a; 提交代码时&#xff0c;eslint校验没有通过&#xff0c;报错 esc[2m183:9esc[22m esc[31mesc[31m✖esc[39m Unexpected empty source esc[2mno-empty-sourceesc[22m 1 problem (esc[31m1 erroresc[39m, esc[33m0 warnings esc[39m) 原因&#xff1a; …...

图论17(Leetcode864.获取所有钥匙的最短路径)

用二进制表示获得的钥匙&#xff0c;假设n钥匙个数 000000000代表没有钥匙&#xff0c;0000000001代表有idx为1的钥匙&#xff0c;0000000011代表有idx1&#xff0c;2的钥匙 &#xff08;这方法巧妙又复杂.. 代码&#xff1a; class Solution {static int[][] dirs {{-1,0}…...

vue 脚手架 入门 记录

vue 脚手架 入门 记录 以管理员身份运行PowerShell执行&#xff1a;get-ExecutionPolicy&#xff0c;回复Restricted&#xff0c;表示状态是禁止的 3.执行&#xff1a;set-ExecutionPolicy RemoteSigned 4.选择Y 注意&#xff1a;一定要以管理员的身份运行PowerShell&#xff…...

汽车租赁系统演示租车小程序H5开发

一款适合汽车租赁业务的程序系统&#xff0c;支持在线支付、一键续租、在线签名。 为了方便用户端方便租车和查看已租车辆的信息和费用&#xff0c;支持上门取车和到店取车两种模式&#xff0c;支持待付款、待取车、待还车、订单管理、已完成、全部订单等订单状态查看和处理功…...

【MySQL】 MySQL 更新数据机制

MySQL 更新数据机制 一、问题描述 假设我们有这样一张表&#xff0c;且包含一条记录&#xff1a; CREATE TABLE mytest ( id int(11) NOT NULL, c1 int(11) DEFAULT NULL, c2 int(11) DEFAULT NULL, c3 int(11) DEFAULT NULL, PRIMARY KEY (id), KEY c1 (c1), KEY c2 (c2) 包…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...