代码随想录算法训练营第48天| Leetcode 121. 买卖股票的最佳时机、Leetcode 122.买卖股票的最佳时机II

文章目录

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

Leetcode 121. 买卖股票的最佳时机

题目链接: Leetcode 121. 买卖股票的最佳时机
题目描述: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
思路: 本题可以用贪心来做,贪心策略:在最便宜的一天买入,然后在该天之后最高的一天(不一定是所有元素最大值)卖出。
代码如下:(贪心)

class Solution {
public:int maxProfit(vector<int>& prices) {int low = INT_MAX;int result = 0;// 贪心策略:在最便宜的一天买入,然后在该天之后最高的一天(不一定是所有元素最大值)卖出for (int i = 0; i < prices.size(); i++) {low = min(low, prices[i]);             // 维护最小值result = max(result, prices[i] - low); // 求最大收益}return result;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

贪心的做法关键在于想到合适的贪心策略。如果没想到贪心策略,本题也可以通过动态规划来解决:

  • dp[i][0]: 表示第i天持有股票所得最多现金;dp[i][1] 表示第i天不持有股票所得最多现金
  • 递推公式: 如果第i天持有股票,则有dp[i][0] = max(dp[i - 1][0], -prices[i]);如果第i天不持有股票,则有dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0])
  • 初始化: dp[0][0] = -prices[0]dp[0][1] = 0
  • 遍历顺序:从前向后遍历

代码如下:(dp)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i][0] = max(dp[i - 1][0], -prices[i]);dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);}return dp[n - 1][1]; // 无论如何最后都要卖出股票}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

我们根据递推公式发现,dp[i]只取决于dp[i - 1]的状态,因此只需要大小为2的数组即可。
代码如下:(dp+滚动数组优化)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(2, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i % 2][0] = max(dp[(i - 1) % 2][0], -prices[i]);dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]);}return dp[(n - 1) % 2][1]; // 无论如何最后都要卖出股票}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

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

题目链接: Leetcode 122.买卖股票的最佳时机II
题目描述: 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润 。
思路: 本题我之前用贪心实现过:可以看这里,因此这里主要介绍动态规划的做法。

本题与上道题的动态规划思路基本相同,唯一的区别在于:由于可以多次买卖股票,因此推导dp[i][0]时,需要考虑第i天买入股票的情况,单纯用-prices[i]表示就不可以了。

  • dp[i][0]: 表示第i天持有股票所得最多现金;dp[i][1] 表示第i天不持有股票所得最多现金
  • 递推公式: 如果第i天持有股票,则有dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);如果第i天不持有股票,则有dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0])
  • 初始化: dp[0][0] = -prices[0]dp[0][1] = 0
  • 遍历顺序:从前向后遍历

代码如下:(dp)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);//与121的唯一区别dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);}return dp[n - 1][1];}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码如下:(dp+滚动数组优化)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(2, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i % 2][0] = max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] - prices[i]);dp[i % 2][1] = max(dp[(i - 1) % 2][1], dp[(i - 1) % 2][0] + prices[i]);}return dp[(n - 1) % 2][1];}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

总结: 这两道题不算难,不过需要理解好两道题的递推公式,不仅要知其然,还要知其所以然。

最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

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

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

相关文章

W5300驱动说明

W5300是一款带有硬件协议栈的网络芯片&#xff0c;内部拥有128K的缓存&#xff0c;最大支持8路socket通信&#xff0c;与MCU之间通过16位数据总线通信&#xff0c;通信速度远超W5500之类以SPI作为通信接口的网络芯片&#xff0c;特别适合对高速网络传输有需求的应用。 本次使用…

使用 helm repo add istio添加了一个helm chart repo,如何查看istio的版本呢

1. 添加chart repo helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update2. 查看版本 helm search repo istio 3. 查看版本详细信息 helm show chart istio/cni 4. 查看某个chart的历史版本 helm search repo <chart-name> --…

【Linux】信号的保存

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 信号在Linux中的保存主要涉及方面 信号的类型&#xff1a; 信号处理程序&#xff1a; 信号的传递和处理&#xff1a; 信号的阻…

面试官:你用过Collections工具类吗?

Collections工具类 1. 常用的 Collections 方法2. 代码示例 Java中的 Collections 工具类提供了一系列静态方法&#xff0c;用于对集合进行各种操作&#xff0c;如排序、查找、替换等。下面我们来看一些 Collections 工具类中常用的API和使用示例。 1. 常用的 Collections 方…

回溯算法套路③排列型回溯+N皇后【基础算法精讲 16】

46 . 全排列 链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 那么怎么确定选了那个数呢? 这里设置一个used表示i选没选过 ; class Solution { public:vector<vector<int>> ans;vector<int> path;void backtrack(vector<int>nums,vect…

2024年【天津市安全员B证】考试内容及天津市安全员B证实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员B证考试内容根据新天津市安全员B证考试大纲要求&#xff0c;安全生产模拟考试一点通将天津市安全员B证模拟考试试题进行汇编&#xff0c;组成一套天津市安全员B证全真模拟考试试题&#xff0c;学员可通过…

《Improving Calibration for Long-Tailed Recognition》阅读笔记

论文标题 《Improving Calibration for Long-Tailed Recognition》 改进长尾识别的校准工作 作者 Zhisheng Zhong、 Jiequan Cui、Shu Liu 和 Jiaya Jia 香港中文大学和 SmartMore 初读 摘要 深度神经网络在训练数据集类别极度不平衡时可能会表现不佳。最近&#xff0c…

pydub、playsound播放声音;gradio、streamlit页面播放声音;gradio 页面图像、视频及调用摄像头

1、pydub from pydub import AudioSegment from pydub.playback import playsong AudioSegment.from_wav(r"C:\Users\loong\Downloads\zh.wav") play(song)2、playsound from playsound import playsoundplaysound(r"voice.wav")3、streamlit import s…

Linux学习:初识Linux

目录 1. 引子&#xff1a;1.1 简述&#xff1a;操作系统1.2 学习工具 2. Linux操作系统中的一些基础概念与指令2.1 简单指令2.2 ls指令与文件2.3 cd指令与目录2.4 文件目录的新建与删除指令2.5 补充指令1&#xff1a;2.6 文件编辑与拷贝剪切2.7 文件的查看2.8 时间相关指令2.9 …

22.基于springboot + vue实现的前后端分离-汽车票网上预定系统(项目 + 论文PPT)

项目介绍 系统是一个B/S模式系统&#xff0c;采用Spring Boot框架&#xff0c;MySQL 数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得汽车票网上预订系统管理工作系统化、规范化。本系统的使用使管理人…

JavaScript作用域及预解析

文章目录 1. 作用域介绍2. 变量的作用域*3. JS中没有块级作用域4. 作用域链5. 预解析预解析案例 1. 作用域介绍 全局作用域局部作用域相同的变量名称在不同的作用域中是不会相互影响的&#xff01; 2. 变量的作用域 全局变量&#xff1a;在全局下都可以使用&#xff1b;局部变…

蓝桥杯——外卖店优先级

外卖店优先级 题目分析 这一题一看N&#xff0c;M&#xff0c;T的范围就知道不能暴力&#xff0c;要讨巧&#xff0c;怎么讨巧是重点。正常的思路是第一层for循环遍历订单&#xff08;或者外卖店&#xff09;&#xff0c;第二层for循环遍历外卖店&#xff08;或者订单&#x…

Vue中 computed 和 watch

在Vue框架中&#xff0c;computed和watch都用于响应数据的变化&#xff0c;但它们在使用上有着不同的侧重点和机制。具体分析如下&#xff1a; 1. 功能差异 computed是计算属性&#xff0c;它是基于它们的响应式依赖进行缓存的。只有当依赖的数据发生变化时&#xff0c;compu…

2827. 范围中美丽整数的数目

文章目录 题意思路代码 题意 题目链接 思路 按位dp暴力 代码 // 暴力 class Solution { public:int numberOfBeautifulIntegers(int low, int high, int k) {int l low / k;int r high / k;if (low % k)l;int ans 0;while (l < r){int tmp l * k;if (10 < tmp &…

华为数通方向HCIP-DataCom H12-821题库(多选题:61-80)

第61题 ACL 可分为如下哪些类别? A.用户自定义 ACL B.基本 ACL C.二层ACL D.高级ACL 【参考答案】ABCD 【答案解析】 A. 用户自定义 ACL (User-defined ACL): 这是用户根据自身需求自定义的 ACL,用于实现特定的访问控制策略。B.基本 ACL (Standard ACL): 基本 ACL 是基于源 …

OCP Secure boot必要特性

三点必需要求&#xff1a; The platform components must: 1. Provide a mechanism for securely anchoring a root of trust public key. // 提供一种用于安全地锚定信任根公钥的机制。 2. Verify the device firmware digital signature using the anchored public key /…

北京大学发布,将试错引入大模型代理学习!

引言&#xff1a;探索语言智能的新边界 在人工智能的发展历程中&#xff0c;语言智能始终是一个核心的研究领域。随着大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;我们对语言智能的理解和应用已经迈入了一个新的阶段。这些模型不仅能够理解和生成自然语言&#x…

动态规划(四)背包dp

01背包 完全背包 多重背包 二维费用背包 分组背包 混合背包

【算法分析与设计】组合

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 示例 1&…

25考研习题记录

3月 汤家凤《1800》 基础篇 日期高等数学线性代数概率论3.1 P92-93 P212-214 3.4 P10-15 P10-19 极限题62题 P73-74 P170-172 行列式17题 考研竞赛凯哥每日一题 张宇高数30讲页数3.4P74