买卖股票的最佳时机 II -数学推导证明贪心思路 -leetcode122

news2024/11/24 17:50:39

问题说明来源leetcode

一、问题描述:

122. 买卖股票的最佳时机 II

难度中等1941

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润

示例 1:

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

示例 2:

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

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

二、题解:

思路:

一路下降是没办法的,一路上升还是有机会的。

那么一路上升时,怎么买呢?

对于一路上升,

1、如果我们买开头和结尾的那个来可以吗?

2、如果中间也买再在中间价格售出怎么样?会不会比1方案好?

事实上最好的应该是去峰峰值,在低谷时买到,再在最高点卖出是赚最多的,不管中间买卖了多少挣了多少,也都是比不上开头和结尾的:

在这里插入图片描述

因为手头上最多只能存1个股票,因此每次只能卖出去了才能再买股票。

就算再中间深刻买了很多股票,赚的肯定也是在最大差值以内的,不可能大于最大差值。而就算狠狠地买和卖也不行,因为买了得卖出去才可以买其他的,因此不断买和卖累加的结果是没办法填满最大差值的(最大差值指的是开头结尾买卖赚的)。这一段就是属于上升的

对于一路下降的肯定是不可能的。

于是得到一个假设:最大利润由每段递增坡度的最小买入,最大卖出得到。

当只有一段递增坡度时,肯定是的。那么当只有2段递增坡度呢?也就是中间有一段是递减的,也是对吧。

那么有4段呢?5段呢?n段?

如果n段时这样子可以得到最大利润,那么n+1可以?

证明一下。

当n段可以这么得来,那么n+1段坡度的总最大利润是有前n段递增的坡度加上第n+1段坡度的最大利润得来的。

前n段的总最大利润得到是s(n),第n+1段的最大利润是a(n + 1)

总最大利润s(n + 1)会不会是 s(n) + a(n + 1)呢?

是吗?左边找到总最大的利润s(n)了,再加上右边的那份利润应该是了吧?

而且找到最大利润都是局部最优得到全局最优的,如果砍掉第n+1个坡度,那么最大利润就是s(n)了,如果不砍掉,那么最大利润肯定是增加了,增加了的就是a(n + 1)

每个局部最优组成最大最优,感觉还是有些没论证,因为全局最优不一定等于局部最优累加,在一些特殊的例子里,可能那些例子是会对全局造成了其他影响了,但是这个题就是按照假设的来办就应该没问题了:

/**
 * @author xin麒
 * @date 2023/1/10 18:04
 */
public class Solution {
    public int maxProfit(int[] prices) {
        int res = 0;
        int minNum = 0;
        if (prices.length == 1) return 0;
        int curr = prices[0];
        for (int i = 1; i < prices.length; i++) {
            if (curr > prices[i]){
                //说明是前一个大于后一个,处于递减坡度,找到最小赋予minNum,然后结束;
                while (i < prices.length){
                    if (curr < prices[i]) break;
                    curr = prices[i];
                    i++;
                }
                i--;//如果是最后的递减坡度,那么i此时是len -1
                //找到最小的赋予curr即可
            }else if (curr < prices[i]){
                //说明是递增坡度,
                minNum = curr;
                //找到最大,赋予curr
                while (i < prices.length){
                    if (curr > prices[i]) break;//此时是最大值。(局部)
                    curr = prices[i];
                    i++;
                }
                i--;
                res += curr - minNum;
            }//如果是平谷,那么不用管。
        }
        return res;
    }
}

其实这道题是和376. 摆动序列很像的,曲线都是跌宕起伏的。

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

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

相关文章

Spark Core----RDD详解

为什么需要RDD 分布式计算需要&#xff1a; 分区控制&#xff08;多台机器并行计算&#xff0c;将一份数据分成多份&#xff0c;在不同机器上执行&#xff09;Shuffle控制&#xff08;不同分区数据肯定需要进行相关的关联&#xff0c;不同分区进行数据传输叫Shuffle控制&…

分享77个NET源码,总有一款适合您

NET源码 分享77个NET源码&#xff0c;总有一款适合您 NET源码下载链接&#xff1a;https://pan.baidu.com/s/1vhXwExVAye5YrB77Vxif8Q?pwdzktx 提取码&#xff1a;zktx 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xf…

Html 3D旋转相册制作

程序示例精选 Html 3D旋转相册制作 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Html 3D旋转相册制作>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习…

zabbix监控主机

zabbix官网 zabbix分为zabbix server&#xff08;zabbix服务端&#xff0c;用来展示监控的&#xff09;和zabbix-agent&#xff08;zabbix客户端用来收集数据的&#xff09; zabbix-agent客户端有两种工作模式&#xff0c;被动模式&#xff08;由zabbix服务来采集数据&#xff…

二十二、Kubernetes中Pod调度第四篇污点(容忍)调度详解、实例

1、概述 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某…

魔方爱好者快来康康,困难的平面魔方来了!

前言和效果图我今天看到一个网站&#xff0c;就是关于魔方的&#xff0c;里面二阶魔方引起了我的兴趣。https://rubiks-cube-solver.com/2x2/进去后你们可以看到&#xff0c;二阶魔方的平面展开图&#xff0c;复原也更加困难。虽然是英文的&#xff0c;但我还是玩得不亦乐乎。好…

查看GPU使用情况和设置CUDA_VISIBLE_DEVICES

文章目录一、简介二、查看GPU状态和信息三、使用3.1临时设置&#xff08;临时设置方法一定要在第一次使用 cuda 之前进行设置&#xff09;3.2python 运行时设置3.3永久设置四、参考资料一、简介 服务器中有多个GPU&#xff0c;选择特定的GPU运行程序可在程序运行命令前使用&am…

企业舆情监控排查什么,TOOM讲解企业舆情监控工作方案?

互联网时代&#xff0c;企业舆情发生因素很多&#xff0c;如果不能及时监控解决&#xff0c;就会引发无限舆情发展&#xff0c;进而影响到企业品牌声誉&#xff0c;引发企业信用危机&#xff0c;所以就需要做好企业舆情监控&#xff0c;接下来我们简单了解企业舆情监控排查什么…

CMMI的五个级别及其特征简述

CMMI 一共分五个级别&#xff0c;一级最低&#xff0c;五级最高&#xff0c;一般企业初次认证CMMI从三级开始。 1、CMMI一级&#xff0c;完成级。在完成级水平上&#xff0c;企业对项目的目标与要做的努力很清晰。项目的目标得以实现。一般来说&#xff0c;公司的初始阶段就…

【C进阶】指针笔试题汇总

家人们欢迎来到小姜的世界&#xff0c;<<点此>>传送门 这里有详细的关于C/C/Linux等的解析课程&#xff0c;家人们赶紧冲鸭&#xff01;&#xff01;&#xff01; 指针笔试题前言一、题1&#xff08;一&#xff09;题目&#xff08;二&#xff09;答案及解析&#…

【Python】函数——模块与函数的导入

概述 为了方便使用函数&#xff0c;我们可以将函数存储在称为模块的独立文件中&#xff0c;再将模块导入到主程序中&#xff0c;导入一个模块需要使用import语句。 导入整个模块 模块是扩展名为.py的文件 1、导入某个模块 语法为&#xff1a; import module_name 2、导入…

[oeasy]python0043_八进制_oct_octal_october_octave

八进制(oct) 回忆上次内容 什么是 转义&#xff1f; 转义转义 转化含义\ 是 转义字符\n、\r是 转义序列 还有什么 转义序列 吗&#xff1f; \a是 响铃\b 退格键\t 水平制表符 tab键\v、\f 实现喂纸不回车 通过 16进制数值 转义 \xhh输出 (hh)16进制对应的ascii字符 如果我们不…

Portainer使用docker compose搭建nacos并初始化MySQL、Portainer stack搭建nacos并初始化MySQL

Portainer使用docker compose搭建nacos初始化MySQL、Portainer stack搭建nacos初始化MySQL新建stack(堆栈)添加stack(堆栈)名称添加docker-compose规则配置环境变量上传初始化sql文件找初始化sql文件nacos初始化mysql-schema.sql文件内容上传sql文件到初始化挂载目录部署stack(…

打印机不打印故障简单排除方法

日常工作中经常会遇到打印机不能打印的情况&#xff0c;那么又没有专业的技术人员在场帮忙的情况下我们也可以自己动手简单的处理一下故障&#xff0c;可以尝试以下的方法进行简单的故障排除&#xff1b; 一、使打印机处于联机状态&#xff0c;如果打印机没有处于联机状态&…

医疗影像工具LEADTOOLS 入门教程: 检测和提取 MICR - 控制台 C#

LEADTOOLS是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#x…

基于STM32或STC的手势控制MP3语音播放器的设计

一. 系统设计框图 区别于传统设计中的按键开关控制&#xff0c;本设计可以实现通过手势控制MP3播放器。采用STM32或STC15单片机和PAJ7620手势模块&#xff0c;能够识别九种手势&#xff0c;分别为上下左右前后&#xff0c;顺时针&#xff0c;逆时针&#xff0c;挥动。在本设计…

SpringBoot视图解析与模板引擎

目录 1、视图解析 1、视图解析原理流程 2、模板引擎-Thymeleaf 1、thymeleaf简介 2、基本语法 3、设置属性值-th:attr 4、迭代 5、条件运算 6、属性优先级 3、thymeleaf使用 1、引入Starter 2、自动配置好了thymeleaf 3、页面开发 4、构建后台管理系统 1、项目…

Java基础03——数组

Java基础03——数组一、数组介绍二、数组的定义与静态初始化1. 定义数组2. 数组静态初始化三、数组元素访问1. 数组的地址值2. 数组访问四、数组遍历五、数组动态初始化六、数组常见问题1. 索引越界异常七、数组常见操作1. 求最值2. 求和3. 交换数据4. 打乱数据八、数组内存图九…

java企业人事管理系统企业工资考勤系统

简介 Java基于ssm开发的企业人事考勤工资系统&#xff0c;员工可以打卡、请假。系统根据员工的打卡情况自动计算工资&#xff08;全勤、请假、旷工、加班、迟到、早退等计算出最终实发工资&#xff09;&#xff0c;员工还可以查看自己的考勤记录工资具体组成等。升级版加了部长…

Linux——信号知识归纳(中)

目录 一.信号与硬件异常 二.阻塞信号和信号结构 &#xff08;一&#xff09;.信号状态 &#xff08;二&#xff09;.信号结构 ①pending表 ②block表 ③handler表 &#xff08;三&#xff09;.信号处理过程 &#xff08;四&#xff09;.阻塞与忽略的区别 &#xff08…