LeetCode面试150——122买卖股票的最佳时机II

news2024/9/21 3:33:29

题目难度:中等

默认优化目标:最小化平均时间复杂度。

Python默认为Python3。

目录

1 题目描述

2 题目解析

3 算法原理及题目解析

3.1 动态规划

3.2 贪心算法

参考文献


1 题目描述

给你一个整数数组 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

2 题目解析

这道题的输入和输出和LeetCode面试150——121买卖股票的最佳时机一样,输入是数组prices,输出是最大利润。只是约束条件变了,现在可以多次买入卖出,但在任何时候只能持有一股股票。

至于题目中“你也可以先购买,然后在 同一天 出售”,我理解是方便写代码,不用同一个功能的代码还要分段写。因为正常同一天卖利润是0,不会操作的。

暴力求解就不考虑了,走两次循环,把所有差值为正的加起来(也就是利润大于0)就行,时间复杂度为O(n^2)。

动态规划法依旧能用。

3 算法原理及题目解析

3.1 动态规划

我们需要确定初始状态以及状态转移方程。

股票只有两种状态,持有或者不持有。持有到不持有就是卖,不持有到持有就是买。我们可以定义一个两维数组dp[i][j],j=0或1。dp[i][0]表示第i天交易完手里没有股票的最大利润,dp[i][1]表示第i天交易完后手里持有一只股票的最大利润。

这样我们就可以得到状态转移方程


dp[i][0]=max(dp[i-1][0],dp[i-1][1]+price[i])\\ dp[i][1]=max(dp[i-1][1],dp[i-1][0]-price[i])

如果状态不发生变化,也就是继续持有或者继续不持有,dp[i][*]=dp[i-1][*]。如果发生变化,如果卖出,dp[i][0]=dp[i-1][1]+prices[i];如果买入,dp[i][1]=dp[i-1][0]-price[i]。两两之间取大即可,然后更新。

至于初始状态,dp[0][0]=0dp[0][1]=-prices[0]

进一步观察,每一天的状态只与前一天的状态有关,而与更早的状态无关。因此我们可以用两个变量取代原来的两个二维数组。

这样平均时间复杂度为O(n),平均空间复杂度为O(1)。

C++代码实现

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int dp0=0,dp1=-prices[0];
​
        for(int price:prices){
            dp0=max(dp0,dp1+price);
            dp1=max(dp1,dp0-price);
        }
​
        return dp0;
​
    }
};

Python代码实现

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp0,dp1=0,-prices[0]
​
        for price in prices:
            dp0=max(dp0,dp1+price)
            dp1=max(dp1,dp0-price)
        
        return dp0

3.2 贪心算法

该问题可以等价如下数学模型


\sum_{i=1}^{n-1}a[r_i]-a[l_i]
 

其中,a[l_i]表示在第l_i天买入,a[r_i]表示在第r_i天卖出。n为prices长度。

我们可以将a[r_i]-a[l_i]写成


a[r_i]-a[l_i]=(a[r_i]-a[r_{i-1}])+(a[r_{i-1}]-a[r_{i-2}])+\cdots+(a[l_i]-a[l_{i-1}]+(a[l_{i-1}]-a[l_{i-2}]))+\cdots
 

这样可以将问题转换为求对两天之间的买卖利润求和。当然,如果利润小于0,就不进行买卖操作。所以最终的公式如下


profit=\sum_{i=1}^{n-1}max(0,a[i]-a[i-1])
 

平均时间复杂度O(n),平均空间复杂度O(1)。

C++代码实现

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size(),profit=0;
​
        for(int i=1;i<n;i++){
            profit+=max(0,prices[i]-prices[i-1]);
        }
​
        return profit;
​
    }
};

Python代码实现

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n,profit=len(prices),0
​
        for i in range(1,n):
            profit+=max(0,prices[i]-prices[i-1])
​
        return profit

参考文献

力扣面试经典150题

力扣官方题解

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

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

相关文章

Spring-FactoryBean来配置Bean

spring通过FactoryBean配置&#xff0c;比前面的工厂方法配置Bean要重要些&#xff0c;因为我们整合很多第三方的框架的时候&#xff0c;需要用到FactoryBean来配置第三方框架中的bean 对象&#xff0c;从而把第三方框架整合到spring中来&#xff01;当然在整合这些第三方框架的…

2024西安铁一中集训DAY28 ---- 模拟赛(简单dp + 堆,模拟 + 点分治 + 神秘dp)

文章目录 前言时间安排及成绩题解A. 江桥不会做的签到题&#xff08;简单dp&#xff09;B. 江桥树上逃&#xff08;堆&#xff0c;模拟&#xff09;C. 括号平衡路径&#xff08;点分治&#xff09;D. 回到起始顺序&#xff08;dp&#xff0c;组合数学&#xff09; 前言 T2好难…

吴恩达老师机器学习-ex4

梯度检测没有实现。有借鉴网上的部分 导入相关库&#xff0c;读取数据 因为这次的数据是mat文件&#xff0c;需要使用scipy库中的loadmat进行读取数据。 通过对数据类型的分析&#xff0c;发现是字典类型&#xff0c;查看该字典的键&#xff0c;可以发现又X&#xff0c;y等关…

使用obsidian-webpage-export 插件,将 Obsidian 中的笔记导出为网页

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

2024下《网络工程师》案例简答题,刷这些就够了!

距离2024下半年软考已经越来越近了&#xff0c;不知道今年备考软考网络工程师的同学们开始准备了吗&#xff1f; 简答题一直是网工拿分的重点区域&#xff0c;对于许多考生来说&#xff0c;也往往是最具挑战性的部分。今天我就把那些重要的案例简答题类型整理汇总给大家&#x…

【Python学习手册(第四版)】学习笔记12-if语句(and、or、三元表达式)详解

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文较简单&#xff0c;对if语句的格式、示例、多路做了示例&#xff0c;以及真值测试&#xff08;and、or等&#xff09;介绍&#xff0c;最后介绍了三三元表达式…

M12电连接器的编码分类及应用领域分析

12电连接器的编码主要包括A、B、C、D、X、S、T、K、L等类型&#xff0c;每种编码都有其特定的应用场景和功能&#xff1a; A编码&#xff1a;适用于传感器、直流电、1G以太网。 B编码&#xff1a;主要用于PROFIBUS总线系统。 C编码&#xff1a;适用于交流电。 D编码&#x…

十八次(虚拟主机与vue项目、samba磁盘映射、nfs共享)

1、虚拟主机搭建环境准备 将原有的nginx.conf文件备份 [rootserver ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak[rootserver ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf[rootserver ~]# grep -Ev "#|^$"…

视频编辑SDK,功能全面、包体小,支持高效灵活接入

如何在快节奏的市场环境中&#xff0c;快速制作出高质量、富有吸引力的视频内容&#xff0c;成为了众多企业面临的共同挑战。美摄科技&#xff0c;作为视频编辑技术的先行者&#xff0c;携其全面功能、小巧包体、高效灵活接入的视频编辑SDK&#xff0c;为企业视频创作带来了革命…

pytorch tensor的高级索引

1. 取索引的方式[[a,b,c...],[a,b,c...] ] 下面的例子对于这个x进行操作 全取x, print(x[:,:,:]) 第一个冒号代表0轴&#xff0c;第二个冒号代表1轴&#xff0c;第三个冒号代表2轴 第一个冒号可以选这类 第二个冒号可以选这类 第三个冒号可以选这类 2. 比较符号 idxx[:,0,:…

全麦饼:健康与美味的完美结合

在追求健康饮食的当下&#xff0c;全麦饼以其独特的魅力脱颖而出&#xff0c;成为了众多美食爱好者的新宠。食家巷全麦饼&#xff0c;顾名思义&#xff0c;主要由全麦面粉制作而成。与普通面粉相比&#xff0c;全麦面粉保留了小麦的麸皮、胚芽和胚乳&#xff0c;富含更多的膳食…

基于SpringBoot+Vue的热门网游推荐网站(带1w+文档)

基于SpringBootVue的热门网游推荐网站(带1w文档) 基于SpringBootVue的热门网游推荐网站(带1w文档) 本系统选用B/S结构开发&#xff0c;它是一个提供可以对热门网游推荐进行信息管理的系统&#xff0c;用户可以在该系统获取最新动态&#xff0c;可以结识更多的朋友&#xff0c;产…

Scrapy vs Beautifulsoup - 哪一个更适合您?

你是新手开发者还是经验丰富的开发者&#xff1f; 不管怎样&#xff0c;有一点是肯定的——网页爬虫对你来说可能很棘手&#xff01; 因此&#xff0c;我们必须选择一个高效的工具来简化我们的工作。 你在权衡哪个更适合网页爬虫&#xff0c;Scrapy还是BeautifulSoup吗&…

基于alpha shapes的任意空间平面点云边缘提取(python)

1、背景介绍 基于alpha shapes提取二维平面点云边缘点&#xff0c;一般是将点云投影至xoy平面&#xff0c;利用x、y坐标根据alpha shapes判别准则即可实现边缘点识别。具体的原理&#xff0c;可以参考之前博客&#xff1a; 基于alpha shapes的点云边缘点提取&#xff08;pytho…

Vulnhub - JANGOW: 1.0.1 靶标实战

靶场地址&#xff1a;https://www.vulnhub.com/entry/jangow-101,754/ 靶场IP&#xff1a;192.168.56.118 信息收集 使用御剑对目标进行扫描 该靶标开启了21、80两个端口&#xff0c;21端口运行服务为ftp&#xff0c;其版本为 vsftpd 3.0.3 &#xff0c;80端口运行服务为Apa…

飞塔fortigate怎么进入cli

好几个人问了好几次 捂脸 就右上角找到这个图标点进去

干货来喽:车载语音识别测试全面分析笔记!

从台架到实车的语音识别专项测试实战&#xff0c;笔记很详细哦&#xff0c;跟着了解学习起来&#xff01; 一、语音识别原理及测试范围 1、语音识别的原理&#xff1a; ① 通过麦克风输入人的声音 ② 声学处理&#xff1a;处理掉杂音,噪音 ③ 特征处理&#xff1a;提取声音中…

花几千上万学习Java,真没必要!(三十七)

IO 流&#xff1a; 读取数据到内存的过程&#xff1a;可以包括从硬盘、网络或其他存储设备中将数据加载到内存中&#xff0c;以便程序能够访问和处理这些数据。 写入数据到硬盘的过程&#xff1a;通常是将内存中的数据保存到硬盘或其他持久性存储设备中&#xff0c;以便长期存…

【香橙派系列教程】(四)基于ARM-Linux架构的语音控制刷抖音项目

【四】基于ARM-Linux架构的语音控制刷抖音项目 文章目录 【四】基于ARM-Linux架构的语音控制刷抖音项目1.语音模块配置1.创建产品2.引脚配置3.词条定义4.添加控制5.发布版本6.烧录固件 2.编程实现语音和开发板通信3.手机接入Linux热拔插1.dmesg命令2.adb调试踩坑问题 3.总结 4.…

Day14-Servlet后端验证码的实现

图片验证码的生成采用的是Kaptcha&#xff1b; Kaptcha是一个高度可配置的验证码生成工具&#xff0c;由Google开源。它通过一系列配置文件和插件&#xff0c;实现了将验证码字符串自动转换成图片流&#xff0c;并可以与session进行关联&#xff0c;从而在验证过程中使用&#…