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

题目难度:中等

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

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.rhkb.cn/news/388380.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时&#xff0c;需要综合考虑多个方面&#xff0c;包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案&#xff1a; 一、前期准备 确定安装位置&#xff1a; 根据使用需求和环境条件&#xff0c;选择一个…

装修新选择:探索浦东地区口碑排名前五的大平层装修公司!

在繁华的浦东中寻找一个安静的港湾&#xff0c;大平层无疑是许多成功人士的首选。宽敞的空间、自由的布局设计&#xff0c;以及优雅的生活氛围&#xff0c;都是大平层备受青睐的理由。以下为您探索的浦东地区口碑排名前五的大平层装修公司&#xff1a; 1.即住空间装饰 即住空…

MoE:混合专家模型介绍(一)

MoE&#xff1a;混合专家模型介绍&#xff08;一&#xff09; 本文是对混合专家模型 (MoE) 详解重点摘要与归纳&#xff0c;有兴趣的小伙伴可以点击链接阅读原文。 混合专家模型 (MoEs)特点 与稠密模型相比&#xff0c;预训练速度更快与具有相同参数数量的模型相比&#xff…

与OpenAI合作:期待已久的苹果AI战略

探讨 Apple 和 OpenAI 合作的AI战略 ©作者|CodeDan 来源|神州问学 一&#xff0e;引言 在当今科技发展日新月异的背景下&#xff0c;大型科技公司的合作与联盟日益成为关注焦点。在最近的2024苹果全球开发者大会上&#xff0c;苹果展示了最新苹果系统上搭载的大模型应用…

Godot入门 05收集物品

创建新场景&#xff0c;添加Area2D节点&#xff0c;AnimatedSprite2D节点 &#xff0c;CollisionShape2D节点 添加硬币 按F键居中&#xff0c;放大视图。设置动画速度设为10FPS&#xff0c;加载后自动播放&#xff0c;动画循环 碰撞形状设为圆形&#xff0c;修改Area2D节点为Co…

Vue3父子组件传属性和方法调用Demo

Vue3父子组件传属性和方法调用Demo 说明目录父组件给子组件传值和方法父组件给子组件传值-使用defineProps接受父组件属性值父组件给子组件传值-使用defineModel接受父组件v-model值当子组件只需要接收父组件一个v-model值时,写法1如下:子组件接收单个v-model写法2如下:当子组件…

海尔智家三翼鸟:从家电到场景,能否跨越智能化陷阱?

在智能家居浪潮的席卷之下&#xff0c;三翼鸟作为海尔智家旗下的场景品牌&#xff0c;曾一度被视为传统家电厂商转型升级的典范。然而&#xff0c;在光鲜亮丽的宣传背后&#xff0c;三翼鸟正逐步暴露出难以忽视的困境与挑战&#xff0c;其智能化之路似乎并不如预期般顺畅。 从用…

微软:云服务大规模宕机因DDoS“防卫过当”

杀毒软件导致全球蓝屏&#xff0c;DDoS防护导致云服务宕机&#xff0c;微软这家全球最大的网络安全公司&#xff0c;正在不断刷新人们对“安全威胁”的认知。 微软本周三晚间宣布&#xff0c;本周二全球范围内多个Microsoft 365和Azure云服务大规模长时间宕机事件的原因&#…

AI大模型应用(2)ChatGLM3本地部署及其在alpaca_zh数据集上的低精度微调

AI大模型应用(2)ChatGLM3部署及其在alpaca_zh数据集上的低精度微调 我们之前已经了解了HuggingFace中peft库的几种高效微调方法。 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT…

deepseek杀疯了,偷摸开源全球一梯队大模型——DeepSeek-V2-Chat-0628

就在今年6月&#xff0c;深度求索团队发布了DeepSeek-V2模型后不久&#xff0c;新版本DeepSeek-V2-Chat-0628 模型也在7月开源了。其推理能力有了极大提升。尤其在数学解题、逻辑推理、编程、指令跟随、Json格式输出不同维度上&#xff0c;最高有16%的性能提升。 在Arena-Hard…

推荐一款前端滑动验证码插件(Vue、uniapp)

uniapp版本&#xff1a;滑块拼图验证码&#xff0c;有后端&#xff0c;简单几步即可实现&#xff0c;小程序、h5都可以用 - DCloud 插件市场 Vue版本及cdn版本可以查阅文档&#xff1a; 行为验证 | Poster 文档 示例代码&#xff1a; <template><view id"app&…

YesPlayMusic本地服务器部署并实现远程在线访问听歌

文章目录 前言1. 安装Docker2. 本地安装部署YesPlayMusic3. 安装cpolar内网穿透4. 固定YesPlayMusic公网地址 前言 本文主要介绍如何在本地快速搭建YesPlayMusic云音乐播放器&#xff0c;并且结合cpolar内网穿透工具实现随时随地远程访问局域网内的音乐播放器听歌。 YesPlayM…

保研408真题练习:2009年全国硕士研究生入学统一考试(单选篇2)

&#x1f9ca;&#x1f9ca;&#x1f9ca;单项选择题&#xff08;共40道&#xff09; &#x1f9ca;操作系统&#xff08;8道&#xff09; &#x1f965;1.进程调度算法 高响应比优先调度&#xff1a;选出响应比最高的进程投入执行&#xff0c;响应比R(等待时间&#xff0b;执…

排序算法:归并排序,golang实现

目录 前言 归并排序 代码示例 1. 算法包 2. 归并排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 归并排序主要操作 1. 合并 2. 分割&#xff08;Divide&#xff09;与递归排序&#xff08;Conquer&#xff09; 总体思想 循环次数测试 假如 10 条数据进行排序…

10、billu-b0x2

难度 中 目标 root权限 首先确定靶机ip地址 netdiscover -i eth0 -r 192.168.189.0/24 kali 192.168.189.58 靶机 192.168.189.184 信息收集端口扫描 看到一个80和8080&#xff0c;先重点摸一下网站的内容 然后看到信息里有个robots.txt 首先就去访问一下 看到有许多不允许…

【C语言】数组和函数实践:扫雷游戏

扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 ⽂件结构设计 2. 扫雷游戏的代码实现&#xff08;1&#xff09;菜单menu函数&#xff08;2&#xff09;设计main函数&#xff08;3&#xff09;设计game函数&#xff08;4…

华为od机试真题:求幸存数之和(Python)

2024华为OD机试&#xff08;C卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给一个正整数列nums&#xff0c;一个跳数jump&#xff0c;及幸存数量left。运算过程为:从索引为0的位置开始向后跳&#xff0c;中间跳过 J 个数字&#xff0c;命中索引为 J1的数…

腾讯云短信服务的开通流程

目录 一、开通服务二、创建secretId和secretKey三、创建应用四、创建实名资质五、创建签名六、创建正文模板一、开通服务 从控制台进入短信模块,点击【开始接入】开通服务: 认证主体首次开通短信服务可获赠国内短信,免费试用: 二、创建secretId和secretKey 创建链接:…

创意无限:11个设计圈热议的UI设计灵感网站集锦

无论你是一个经验丰富的UI设计师还是一个新的UI设计师&#xff0c;拥有一些高质量、可靠的UI设计网站灵感库都能加速你的设计过程。借助灵感资源&#xff0c;您可以更快、更有效地启动该项目。与此同时&#xff0c;优秀的UI设计网站也能帮助您探索新的设计解决方案&#xff0c;…

个性化你的生产力工具:待办事项App定制指南

国内外主流的10款待办事项软件对比&#xff1a;PingCode、Worktile、滴答清单、番茄ToDo、Teambition、Todoist、Microsoft To Do、TickTick、Any.do、Trello。 在寻找合适的待办事项软件时&#xff0c;你是否感到选择众多、难以决断&#xff1f;一个好的待办事项工具可以大大提…