面试经典150题 买卖股票的最佳时机 II

devtools/2024/10/22 6:25:55/

面试经典150题 day8

      • 题目来源
      • 我的题解
        • 方法一 动态规划
        • 方法二 贪心+一次遍历

题目来源

力扣每日一题;题序:122

我的题解

方法一 动态规划

与 买卖股票的最佳时机 的区别在于:可以多次买入、卖出。

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

java">public int maxProfit(int[] prices) {int n=prices.length;int[][] dp=new int[n][2];//0买 1卖for(int i=0;i<n;i++){if(i==0){dp[i][0]=-prices[0];dp[i][1]=0;continue;}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[n-1][1];
}
java">//空间优化版本
public int maxProfit(int[] prices) {int n=prices.length;int dp_0=-prices[0];//买int dp_1=0;//卖for(int i=1;i<n;i++){int t=dp_0;dp_0=Math.max(dp_0,dp_1-prices[i]);dp_1=Math.max(dp_1,t+prices[i]);}return dp_1;
}
方法二 贪心+一次遍历

由于股票的购买没有限制,因此整个问题等价于寻找 x 个不相交的区间 ( l i , r i ] (l_i,r_i] (li,ri]使得如下的等式最大化 ∑ i = 1 x a [ r i ] − a [ l i ] i = 1 \sum_{i=1}^{x} a[r_i]-a[l_i] i=1 i=1xa[ri]a[li]i=1,其中 l i l_i li 表示在第 l i l_i li天买入, r i r_i ri表示在第 r i r_i ri天卖出。同时注意到对于 ( l i , r i ] (l_i,r_i] (li,ri]这一个区间贡献的价值 a [ r i ] − a [ l i ] a[r_i]-a[l_i] a[ri]a[li],其实等价于 ( l i , l i + 1 ] , ( l i + 1 , l i + 2 ] , … , ( r i − 1 , r i ] (l_i,l_i+1],(l_i+1,l_i+2],\ldots,(r_i-1,r_i] (li,li+1],(li+1,li+2],,(ri1,ri]这若干个区间长度为 1 的区间的价值和,即
a [ r i ] − a [ l i ] = ( a [ r i ] − a [ r i − 1 ] ) + ( a [ r i − 1 ] − a [ r i − 2 ] ) + … + ( a [ l i + 1 ] − a [ l i ] ) a[r_i]-a[l_i]=(a[r_i]-a[r_i-1])+(a[r_i-1]-a[r_i-2])+\ldots+(a[l_i+1]-a[l_i]) a[ri]a[li]=(a[ri]a[ri1])+(a[ri1]a[ri2])++(a[li+1]a[li])
因此问题可以简化为找 x 个长度为 1 的区间 ( l i , l i + 1 ] (l_i,l_i+1] (li,li+1]使得 ∑ i = 1 x a [ l i + 1 ] − a [ l i ] \sum_{i=1}^{x} a[l_i+1]-a[l_i] i=1xa[li+1]a[li]价值最大化。
贪心的角度考虑每次选择贡献大于 0 的区间即能使得答案最大化,因此最后答案为 ans = ∑ i = 1 n − 1 max ⁡ { 0 , a [ i ] − a [ i − 1 ] } \textit{ans}=\sum_{i=1}^{n-1}\max\{0,a[i]-a[i-1]\} ans=i=1n1max{0,a[i]a[i1]},其中 n 为数组的长度。
贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。

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

java">public int maxProfit(int[] prices) {int total=0;int len=prices.length;for(int i=1;i<len;i++){if(prices[i]>prices[i-1]){total+=prices[i]-prices[i-1];}}return total;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~


http://www.ppmy.cn/devtools/11281.html

相关文章

Linux 操作系统的引导过程

Linux系统开机引导过程&#xff1a; 开机自检 检测硬件设备&#xff0c;找到能够引导系统的设备&#xff0c;比如硬盘MBR引导 运行MBR扇区里的主引导程序GRUB启动GRUB菜单 系统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和…

【Linux开发 第十一篇】rpm和yum

rpm rpm用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中&#xff0c;就是一种Linux中软件包的管理工具 rpm包指令 rpm -qa&#xff1a;查询所安装的所有的rpm软件包 rpm -qa | more rom -qa | grep X rpm -q 软件包名:查询软件包是否安装 rpm -qi 软…

webmagic 爬取https的网站抛avax.net.ssl.SSLHandshakeException异常

webmagic 抓取带有https的网站&#xff0c;抛出的异常javax.net.ssl.SSLHandshakeException。 初步解决办法&#xff1a; 1,在自己的项目中新建httpclient文件夹&#xff0c;新建类HttpClientGenerator, 复制webmagic源码中的 HttpClientGenerator. 2.修改 HttpClientGenerator…

现货白银保证金交易要先分析趋势

现货白银是保证金交易品种&#xff0c;买卖过程中可能会涉及数十倍的资金杠杆&#xff0c;所以它对投资者的分析水平和交易水平的要求都比较高&#xff0c;所以在进入这个市场之前&#xff0c;投资者需要先学习一些基本的分析方法&#xff0c;当中可以分为基本面和技术面两大流…

常见面试算法题-九宫格按键输入法

■ 题目描述 九宫格按键输入&#xff0c;判断输出&#xff0c;有英文和数字两个模式&#xff0c;默认是数字模式&#xff0c;数字模式直接输出数字&#xff0c;英文模式连续按同一个按键会依次出现这个按键上的字母&#xff0c;如果输入”/”或者其他字符&#xff0c;则循环中…

Spring Boot+Mybatis+DM数据库

达梦数据库(DM Database)是武汉达梦数据库股份有限公司研发的新一代大型通用关系型国产数据库&#xff0c;全面支持 SQL 标准和主流编程语言接口/开发框架。行列融合存储技术&#xff0c;在兼顾 OLAP 和 OLTP 的同时&#xff0c;满足 HTAP 混合应用场景。 在公司项目开发过程中…

第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队

关联比赛: 第二届阿里巴巴大数据智能云上编程大赛-智联招聘人岗智能匹配 查看更多内容&#xff0c;欢迎访问天池技术圈官方地址&#xff1a;第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队_天池技术圈-阿里云天池

服务器基本故障和排查方法

前言 服务器运维工作中遇到的问题形形色色&#xff0c;无论何种故障&#xff0c;都需要结合具体情况&#xff0c;预防为主的思想&#xff0c;熟悉各种工具和技术手段&#xff0c;养成良好的日志分析习惯&#xff0c;同时建立完善的应急预案和备份恢复策略&#xff0c;才能有效…