Leetcode面试经典150题-123.买卖股票的最佳时机III

news/2024/9/19 2:18:32/ 标签: leetcode, 面试, 算法

  解法都在代码里,不懂就留言或者私信

建议看这个之前先看股票系列的其他问题123.买卖股票的最佳时机III

Leetcode面试经典150题-121.买卖股票的最佳时机-CSDN博客

Leetcode面试经典150题-122.买卖股票的最佳时机II-CSDN博客

Leetcode面试经典150题-188.买卖股票的最佳时机IV-CSDN博客

尤其是122和188题,这个题的解题其实就是一个简单的加工

class Solution {public static int maxProfit(int[] prices) {return maxProfit(2, prices);}/*** 本题比股票问题2多了一个限制:最多交易k次,也就是可能不能像我们之前的那种每次波谷都买,每次波峰都卖的方式* 除非k是大于等于prices.length/2的* @param k 这里的k是交易的对数,也就是买一次卖一次* @param prices* @return*/public static int maxProfit(int k, int[] prices) {if(prices == null || prices.length < 2 || k < 1) {return 0;}int ans = 0;//如果交易数限制大于prices.length/2,那我们还是可以认为这就是无限次的交易//套用股票问题2的解法if(k >= prices.length / 2) {for(int i = 1; i < prices.length; i++) {int curProfit = Math.max(0,prices[i] - prices[i - 1]);ans += curProfit;}return ans;} else {int N = prices.length;//如果小于这个次数的话就需要好好分析一下了,这里我们使用动态规划的从左往右的尝试模型+业务限制进行解题//先定义一个动态规划表,表中dp[i][j]代表从0~i做不超过j次交易可以获得的最大的利润,所以i的变化范围0~N-1,j的变化范围从0到kint[][] dp = new int[N][k+1];//第一行表示从0~0做0~k次交易,都是0,int默认是0,这里忽略初始化//第一列表示从0~0,0~1...0~N分别做0次交易,你都没有做交易,你有啥利润,也都是0,同样忽略初始化过程//从dp[1][1]开始初始化,如果按照一般的方式进行初始化则dp[8][2] 有几种可能性(1)8位置不交易,那这种可能是dp[7][2]//(2)8位置参与交易,那8位置只能卖(因为我们限制0~8进行2次交易,如果你8位置是买的话利润就无法计算到dp[8][2]里了)//那我们可以分别在0~8进行买入,分别是dp[8][1] + prices[8] - prices[8](8位置买入,8位置卖出)//dp[7][1] + prices[8] - prices[7](7位置买入,8位置卖出)....dp[0][1] + prices[8] - prices[1]//也是就说在O(N*k)的基础上我们又加上了枚举行为,时间复杂度变成了O(N^2*k)这个对于leetCode给的数据量来说,不一定能过//这里我们尝试进行斜率优化,斜率优化分析过程参考:https://www.xiaohuazhuo.com/board/658accf232120d0c5d74f794//这里简单描述一下,其实我们dp[8][2]求解过程中可能性2的每一项都加上了price[8]这个数,也就是说比较过程我们可以不计算这个数//在dp[8][1] - [8] dp[7][1] - [7]....dp[0][1] - [0]中取最大值max,然后+[8]就是当前可能性2的最大值//为什么要求这样的最大值呢,因为我们之后的计算过程用的上,现在举一个dp[9][2]的求解过程,可能性1:9位置不交易 =dp[8][2]//9位置交易,那0~9都可以买入,分别是dp[9][1] + [9] - [9](9位置买入,9位置卖出) dp[8][1] + [9] - [8](8位置买入,9位置卖出)// dp[7][1] + prices[9] - prices[7](7位置买入,9位置卖出)....dp[0][1] + prices[9] - prices[1]//这些项里我们又看到了加上了一样的prices[9], 所以比较的时候只需要拿dp[9][1] - [9] dp[8][1] - [8] dp[7][1] - [7]....dp[0][1] - [0]//这些取最大值就可以了,但是这些出了第一项之外,不就是dp[8][2]的时候求的max吗?所以复用dp[9][2]时候的max=Math.max(max, dp[9][1] - [9])//也就是说对于同一列的后面的行只需要多计算一个数(dp[i][j-1] - prices[i]),然后根据前面的max计算就可以了for(int j = 1; j <= k; j++) {//对于同一列,后面的行依赖于前面的行,这里我们定义一下公共的依赖//这里要注意max的初始值不是0,而是dp[0][j] + prices[0]-prices[0] 的中间部分,也就是dp[0][j]-prices[0]int max = dp[0][j]-prices[0];int p1 = 0;for(int i = 1; i < N; i ++) {p1 = dp[i - 1][j];//0//max函数第一个参数就是当前位置要计算的数dp[i][j-1] - prices[i]max = Math.max(dp[i][j - 1] - prices[i], max);//dp[1][0]-dpdp[i][j] = Math.max(p1, max + prices[i]);System.out.println(i+","+ j + "=" + dp[i][j]);}}ans = dp[N-1][k];}return ans;}
}

这个题解法回头我和股票问题4综合一下,其实两个题是一样的,面试肯定保过


http://www.ppmy.cn/news/1520257.html

相关文章

Android Framework(三)Activity启动流程

文章目录 大纲总体流程 第一阶段&#xff1a;点击图标启动应用流程概览SourceActivity端处理system_service处理启动请求参数的构建activityInfo的解析创建ActivityRecord 窗口层级树的处理获取Task--getOrCreateRootTaskActivityRecord挂载到Task--setNewTask移动Task到容器顶…

MySQL集群技术4——MySQL路由

mysql-route MySQL 路由&#xff08;Routing&#xff09;通常指的是在 MySQL 架构中如何处理客户端请求和数据流向的问题。在 MySQL 中&#xff0c;路由可以涉及多种不同的场景和技术&#xff0c;包括但不限于反向代理、负载均衡、读写分离等。下面我将详细介绍这些场景和技术…

数学基础 -- 线性代数之酉矩阵

酉矩阵&#xff08;Unitary Matrix&#xff09; 酉矩阵是线性代数中一种重要的矩阵类型&#xff0c;特别在量子力学和信号处理等领域有广泛的应用。以下是酉矩阵的定义、性质以及使用和计算的例子。 1. 定义 酉矩阵是一个复矩阵 U U U &#xff0c;满足以下条件&#xff1a…

【tomcat详解】功能+部署+Nginx反向代理+Memcached+session会话

目录 一、Tomcat简介 二、Tomcat功能介绍 2.2 tomcat文件组成 2.3 生成tomcat启动文件 三、Tomcat部署 3.1 常见部署方式介绍 3.2 利用nginx实现反向代理 四、Memcached 4.1 memcached安装启动 4.2 memcached操作命令 五、Session共享服务器 5.1 msm介绍 一、Tomcat…

电商智能分析:阿里巴巴商品详情API返回值的挖掘与利用

电商智能分析是利用大数据和机器学习技术来深入理解用户行为、商品趋势以及市场变化的过程。阿里巴巴商品详情API作为获取商品详细信息的重要工具&#xff0c;其返回值中蕴含了丰富的数据&#xff0c;可以通过挖掘和利用这些数据来进行智能分析。下面&#xff0c;我将提供一个基…

n*n矩阵,输出矩阵中任意两点之间所有路径

题目1&#xff1a;给你一个正整数n&#xff0c; 构造一个n*n的四项链表矩阵。 要求&#xff1a; 1.使用四项链表 2.矩阵从左到右&#xff0c;从上到下值依次为1,2,3,4,......n*n 题目2&#xff1a;基于题目1&#xff0c; 在n*n链表矩阵中&#xff0c;输出矩阵中任意两点之间所有…

9、Django Admin优化查询

如果你的Admin后台中有很多计算字段&#xff0c;那么你需要对每个对象运行多个查询&#xff0c;这会使你的Admin后台变得非常慢。要解决此问题&#xff0c;你可以重写管理模型中的get_queryset方法使用annotate聚合函数来计算相关的字段。 以下示例为Origin模型的中ModelAdmin…

嵌入式Linux:常见信号的默认行为

信号是一种软件中断&#xff0c;用于通知进程发生了某种异步事件。信号可以由用户、其他进程或操作系统内核产生。进程可以选择捕获并处理这些信号&#xff0c;或者忽略它们&#xff0c;让系统执行默认操作。 不可靠信号&#xff08;非实时信号&#xff09;&#xff1a;编号为 …

使用QTcpSocket在两台ubuntu之间实现通讯

重点提取&#xff1a; 1.保证服务端和客户端端口号一致 2.保证服务端和客户端在同一网段(可以通过网线连接) 3保证客户端界面输入的ip是服务段的ip 实现步骤&#xff1a; 首先&#xff0c;构造服务端界面和客户端界面如下 服务端界面 客户端界面 其次具体代码 在.pro文件…

Linux 命令行快捷键

Linux 命令行快捷键_linux删除一个单词-CSDN博客 涉及在linux命令行下进行快速移动光标、命令编辑、编辑后执行历史命令、Bang(!)命令、控制命令等。让basher更有效率。 常用 Ctrl左右键:在单词之间跳转 Ctrla: 跳到本行的行首 Ctrle: 跳到页尾 Ctrlu&#xff1a;删除当前光标…

SpringWeb 重定向

现在前端后分离&#xff1a;如何确认是跳转到前端页面还是后端的方法呢&#xff1f;RedirectView&#xff1a;重定向如何区分重定向的是前端页面还是后端的一个controller呢 先看下&#xff1a;SpringBoot系列教程web篇之重定向-阿里云开发者社区 ## 根据浏览器中返回的状态码…

数据结构串的模式匹配算法--BF暴力匹配

BF&#xff08;Brute-Force&#xff0c;暴力匹配&#xff09;算法是一种简单的字符串匹配算法&#xff0c;其基本思想是将目标串S逐个字符与模式串P进行比对&#xff0c;直到找到匹配或遍历完S为止。下面是一个使用C语言实现的BF算法示例&#xff1a; #include <stdio.h>…

用友U8 CRM exportdictionary.php SQL注入漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 exportdictionary.php 文件存在SQL注入漏洞,未经身份验证的攻击者通过漏洞执行任意S…

全志Linux磁盘操作基础命令

磁盘操作 fdisk命令 fidsk是一个用来创建和维护磁盘设备分区的一个实用工具。 [ubuntubook:~]$ fdisk -l //列出当前系统所有的磁盘设备 [ubuntubook:~]$ fdisk /dev/sdc //操作设备节点为 /dev/sdc的一个设备。p : 显示所有的分区。d: 删除分区。n: 创建一个新的分区。t : …

使用QT开发一些特殊相机的思路:个人经验

前言&#xff1a; 去年使用QT开发过Dalsa线扫相机的应用程序&#xff0c;去获取数据&#xff0c;显示图片&#xff0c;实时分析等&#xff0c;测试demo的链接如下&#xff1a; Dalsa线扫相机-二次开发-QT-C 可用Demo&#xff08;一&#xff09;_dalsa开发-CSDN博客 前段时间&am…

基于Java+SpringBoot+Vue+MySQL的在线装修管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的在线装修管理系统【附源码文档】、前后…

解决Springboot项目Maven下载依赖速度慢的问题

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

数学建模笔记

1.三级表的制作 打开word找到插入并点击表格 随机生成一个表格&#xff0c;然后去修改表格样式&#xff0c;把格式应用于选到标题行&#xff0c;然后点击格式&#xff0c;选到边框和底纹&#xff0c;把宽度改为1.5磅&#xff0c;然后点击上下俩个田字&#xff0c;预览图会出现…

RabbitMQ中间件监控指标解读

监控易是一款全面的IT监控软件&#xff0c;能够实时监控各种IT资源和应用&#xff0c;确保系统的稳定运行。在RabbitMQ中间件的监控方面&#xff0c;监控易提供了详尽的监测指标&#xff0c;帮助用户深入了解RabbitMQ集群的运行状态和性能表现。 一、集群监控&#xff08;sdds…

飞思相机存储卡格式化数据如何恢复?提供全面指南

在数字摄影时代&#xff0c;‌飞思相机以其卓越的成像质量和专业的性能&#xff0c;‌赢得了众多摄影师的青睐。‌然而&#xff0c;‌即使是专业的设备也难免遭遇数据丢失的困境&#xff0c;‌尤其是当存储卡不幸被格式化时。‌面对这一突如其来的灾难&#xff0c;‌许多摄影师…