算法训练(leetcode)二刷第三十五天 | *121. 买卖股票的最佳时机、*122. 买卖股票的最佳时机 II、*123. 买卖股票的最佳时机 III

news/2024/12/16 0:18:46/

刷题记录

  • *121. 买卖股票的最佳时机
    • 贪心
    • *动态规划
  • *122. 买卖股票的最佳时机 II
  • *123. 买卖股票的最佳时机 III

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

leetcode题目地址

贪心

记录最低价格作为买入价格,并用当前价格减去最低价格获得利润。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

// java
class Solution {public int maxProfit(int[] prices) {int sum = 0, start = prices[0];for(int i=1; i<prices.length; i++){start = Math.min(start, prices[i]);sum = Math.max(sum, prices[i]-start);} return sum;}
}

*动态规划

首先需要理清楚dp数组的含义,dp数组中存储的是持有或不持有的利润,而不是当天买入或卖出的利润。

dp[i][0]表示第i天持有股票的利润,可以之前买入也可以当天买入,取二者最大值保留即可,即,dp[i][0] = max(dp[i-1][0], -prices[i])
dp[i][1]表示第i天不持有股票的利润,可以之前卖出也可以当天卖出,同样取二者最大值保留,即,dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i])

// java
class Solution {public int maxProfit(int[] prices) {int n = prices.length;int[][] dp = new int[n][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i=1; i<n; i++){// 持有dp[i][0] = Math.max(dp[i-1][0], -prices[i]);dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0]+prices[i]);}return dp[n-1][1];}
}

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

leetcode题目地址

使用二维dp数组,dp[i][0]表示第i天持有股票的价值,dp[i][1]表示第i天不持有股票的价值。

  • dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1]-prices[i]);
    第i天持有股票的价值 = max(前一天就持有股票的价值,当天买入股票)
  • dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0]+prices[i]);
    第i天不持有股票的价值 = max(前一天就不持有股票的价值,当天卖出股票)

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][2];dp[0][0] = -prices[0];dp[0][1] = 0;for(int i=1; i<prices.length; i++){dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1]-prices[i]);dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0]+prices[i]);}return dp[prices.length-1][1];}
}

*123. 买卖股票的最佳时机 III

leetcode题目地址

使用二维dp数组来记录每天的状态下的最大收益,即:
dp[i][j]表示第i天的第j个状态的最大收益。

共有五个状态

  • 0 未操作(可省略)
  • 1 第一次持有
  • 2 第一次不持有
  • 3 第二次持有
  • 4 第二次不持有

本题的难点在于初始化。

本题要求每次购入之前不许持有股票,也就是卖出后才能重新购入。

因此,初始化如下:

  • dp[0][0]表示第0天不操作,收益为0.
  • dp[0][1]表示第0天第一次持有(即当天第一次买入),收益为-prices[0]
  • dp[0][2]表示第0天第一次不持有(即当天第一次卖出),收益为dp[0][1]+prices[0],也就是0
  • dp[0][3]表示第0天第二次持有(即当天第二次买入),收益为dp[0][2]-prices[0],也就是-prices[0]
  • dp[0][4]表示第0天第二次不持有(即当天第二次卖出),收益为dp[0][2]+prices[0],也就是0

dp[0][3]和dp[0][4]比较难想到,因为它是在同一天进行的两次操作。

每一个状态的更新,依赖于前一个状态的结果。也就是持有的状态下才能卖出、不持有的状态下才能买入。

dp[i][0]可以忽略不使用,因为在整体状态转移中和这个状态没有关系。(或者可以理解为第一次买入是在未操作的状态上进行的)

最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。可以这么理解:如果第一次卖出已经是最大值了,那么我们可以在当天立刻买入再立刻卖出。所以dp[i][4]已经包含了dp[i][2]的情况。也就是说第二次卖出手里所剩的钱一定是最多的。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
class Solution {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][5];dp[0][1] = -prices[0];dp[0][3] = -prices[0];for(int i=1; i<prices.length; i++){dp[i][1] = Math.max(dp[i-1][1], -prices[i]);dp[i][2] = Math.max(dp[i-1][2], dp[i-1][1]+prices[i]);dp[i][3] = Math.max(dp[i-1][3], dp[i-1][2]-prices[i]);dp[i][4] = Math.max(dp[i-1][4], dp[i-1][3]+prices[i]);}return dp[prices.length-1][4];}
}

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

相关文章

二、pxe安装失败,交换机tcpdump dhcp数据包

在交换机上使用 tcpdump 抓取 DHCP 数据包可以帮助你监控和分析 DHCP 流量,这对于故障排除网络配置问题或了解 DHCP 服务器与客户端之间的交互非常有用。不过需要注意的是,并不是所有的交换机都支持直接运行 tcpdump,这通常是在 Linux 或类 Unix 系统上使用的命令行工具。对…

oracle 架构详解

Oracle 数据库是一个复杂且强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于企业级应用中。了解 Oracle 的架构对于数据库管理员&#xff08;DBA&#xff09;、开发人员和架构师来说至关重要。以下是 Oracle 数据库架构的详细解析&#xff0c;涵…

前端有没有必要转岗?

前端开发是否有必要转岗&#xff0c;取决于多个因素&#xff0c;包括行业发展趋势、个人职业规划、技能需求变化等。‌ 前端开发的现状和挑战 前端开发在过去几年中经历了显著的变化。随着各大高校计算机专业的扩招和互联网发展的放缓&#xff0c;前端开发岗位的竞争变得更加…

Ubuntu安装Python3.12安装PJSUA2

Ubuntu安装Python3.12安装PJSUA2 系统版本&#xff1a;Ubuntu 22.04.3 LTS sudo apt install build-essential python3-dev python3-setuptools \libasound2-dev libpulse-dev libssl-dev libogg-dev libv4l-dev \libx11-dev libxv-dev libncurses5-dev libxml2-dev libsqlite…

vue3+echarts+websocket分时图与K线图实时推送

一、父组件代码&#xff1a; <template> <div class"chart-box" v-loading"loading"> <!-- tab导航栏 --> <div class"tab-box"> <div class"tab-list"> <div v-for"(item, index) in tabList…

数据结构——ST表

ST表的定义 ST表&#xff0c;又名稀疏表&#xff0c;是一种基于倍增思想&#xff0c;用于解决可重复贡献问题的数据结构 倍增思想 这里列举一个去寻找一个区间内的最大值的例子 因为每次会将将区间增大一倍&#xff0c;所以才被称之为倍增思想 &#xff0c;这种思想十分好用…

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域&#xff0c;传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求&#xff0c;促使企业寻求突破之道。而 3D 视觉定位技术&#xff0c;为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…

MVVM和MVC区别

概念深入理解 MVC&#xff08;Model - View - Controller&#xff09; Model&#xff08;模型&#xff09; 它是整个架构的数据核心&#xff0c;负责数据的完整性和一致性。这包括数据的存储结构定义、数据访问逻辑&#xff08;如数据库连接、查询语句的编写&#xff09;以及数…