LeetCode-Java:122. 买卖股票的最佳时机Ⅱ
题目
给你一个整数数组 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 。
解
这道题目和121的区别在于,购买者同时只能持有一只股票,但是可以交易多次,比如示例1
①暴力解,代码来源自leetcode,主要思想为递归的方式,返回到叶子结点的一次收益,判断收益是否比之前的最大收益要大,如果更大的话更换存储的最大收益值。本题遍历了所有的情况,不适用于数据量较多的情况,故用例时间超出

(图片来源自leetcode,作者liweiwei1419)
class Solution {
private int maxprofit;
public int maxProfit(int[] prices) {
if(prices.length<2) return 0;
this.maxprofit=0;
dfs(prices,0,0,maxprofit);
return this.maxprofit;
}
private void dfs(int[] prices,int index,int status,int profit){
//各个元素含义:价格数组,当前下标,是否有股票,当前收益
if(index==prices.length){
this.maxprofit=Math.max(this.maxprofit,profit);//取当前收益和历史最大收益二者之间的最大值
return;
}
dfs(prices,index+1,status,profit);//深度优先搜索,对应图当中所有树取左边的结果
if(status==0){
//如果没有购入的话,可以考虑购入一下,购入的话就得减去当日价格,然后数组+1指向下一层
dfs(prices,index+1,1,profit-prices[index]);
}
else{
//如果已经购入,可以考虑卖出一下,卖出+当日价格,然后数组+1指向下一层
dfs(prices,index+1,0,profit+prices[index]);
}
}
}
②动态规划,二维数组,题解思路来源leetcode,创建一个二维数组,超过28.33%的用户
二维数组a[i][j]表示为第i状态为j的最大收益情况(j表示是否持股,0不持股,1持股)
class Solution {
private int maxprofit;
public int maxProfit(int[] prices) {
if(prices.length<2) return 0;
int [][]dp=new int[prices.length][2];
dp[0][0]=0;
dp[0][1]=0-prices[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][0];//最后一天不持有的情况肯定是最大值
}
}
③如果前一天买进,今天卖出可以赚钱的话就+
class Solution {
private int maxprofit;
public int maxProfit(int[] prices) {
if(prices.length<2) return 0;
int max=0;
for(int i=1;i<prices.length;i++){
if(prices[i]-prices[i-1]>0){
max+=prices[i]-prices[i-1];
}
}
return max;
}
}
LeetCode-Java:122. 买卖股票的最佳时机Ⅱ的更多相关文章
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- Java实现 LeetCode 122 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意: ...
- 【Leetcode】【简单】【122. 买卖股票的最佳时机 II】【JavaScript】
题目描述 122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票) ...
- Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
Leetcode之动态规划(DP)专题-122. 买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II) 股票问题: 121. 买卖股票的最佳时机 122. ...
- 刷题-力扣-122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell ...
- 【力扣】122. 买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
- 力扣 122 买卖股票的最佳时机II
力扣 122 买卖股票的最佳时机II 思路: 动态规划,表面上是\(O(2^n)\)的搜索空间,实际上该天的选择只与前一天的状态(是否持有股票)有关.从收益的角度来看,确实每一天的不同选择都会产生不同 ...
- LeetCode初级算法之数组:122 买卖股票的最佳时机 II
买卖股票的最佳时机 II 题目地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 给定一个数组,它的第 i ...
- LeetCode(122. 买卖股票的最佳时机 II)
问题描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你 ...
- LeetCode 122.买卖股票的最佳时机(C++)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
随机推荐
- 【Unity3D】调整屏幕亮度、饱和度、对比度
1 屏幕后处理流程 调整屏幕亮度.饱和度.对比度,需要使用到屏幕后处理技术.因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度.饱和度.对比度的实现. 本文完整资源见→Unity3D调整屏幕 ...
- 7、Spring之基于注解管理bean
本质上:所有一切的操作都是Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行. 7.1.环境搭建 创建名为spring_ioc_annotation的新module,过程参考3.1 ...
- 论文解读(PERL)《PERL: Pivot-based Domain Adaptation for Pre-trained Deep Contextualized Embedding Models》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:PERL: Pivot-based Domain Adaptation for Pre-trained D ...
- 智能AI 的应用场景
小凡智能AI是一款基于人工智能技术开发的助软件,能够帮助用户解决各种各样的问题,提高工作效率和生活质量.它的应用范围广泛,涵盖了工作.学习.健康等多个方面,为用户提供了全方位的服务支持. 在工作方面, ...
- vsftp简单配置
添加用户 vi /etc/pam.d/vsftdp 注释掉 auth required pam_shells.so
- C# 代码实现关机
AdvApi32.LookupPrivilegeValue(null, "SeShutdownPrivilege", out var lpLuid); using var t = ...
- dedebiz实时时间调用
{dede:tagname runphp='yes'}@me = date("Y-m-d H:i:s", time());{/dede:tagname}
- Solution -「ARC 103B」Robot Arms
Description Link. 给定 \(n\) 组坐标.构造长度为 \(m\) 的序列 \(\{c_n\}\) 和 \(n\) 组包含 LRUD 的路径,满足对于每一组坐标: \(c_i\) 表 ...
- apollo多环境部署
一.环境准备 jdk : 1.8+ mysql 5.6.5+ 二.安装包下载 https://github.com/ctripcorp/apollo/releases 下载如下三个压 ...
- MySQL中sql_mode的设置
在升级MySQL版本到8.0的过程中,需要关注sql_mode参数默认值的变化,8.0版本sql_mode不支持 NO_AUTO_CREATE_USER,要避免配置的sql_mode中带有 NO_AU ...