当前位置: 首页 > 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) 包…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...