51.Best Time to Buy and Sell Stock(动态规划)

2024-05-12 01:18

本文主要是介绍51.Best Time to Buy and Sell Stock(动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

分析:题目要求只能进行一次买卖操作,所以采取动态规划的思想。

sum表示目前已经p[0..i-1]满足条件的最大收益;

low 和 high表示目前已经p[0..i-1]满足条件的买卖价格;

如果新的prices[i]比high大,则将其置为新的high;

prices[i]比low小,则将其置为新的high和low;

拿之前的sum和新生成的high-low的值进行比较,决定是否更新sum的值.

 public int maxProfit(int[] prices) {int len = prices.length;if(len==0){return 0;}int sum = 0;//sum表示目前已经p[0..i-1]满足条件的最大收益int high = prices[0];//low 和 high表示目前已经p[0..i-1]满足条件的买卖价格int low = prices[0];for(int i =1;i<len;i++){if(prices[i]>high){//如果新的prices[i]比high大,则将其置为新的highhigh = prices[i];}else if(prices[i]<low){//prices[i]比low小,则将其置为新的high和lowhigh = prices[i];low = prices[i];}if(sum < high - low){//拿之前的sum和新生成的high-low的值进行比较,决定是否更新sum的值sum = high - low;}}return sum;}

后面做题的时候发现小米2016年校招的题目也用到了这个思想,不同的时候那个题目要求最多可以有两次的买卖操作。

风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100 。

那么题目转化为可以用第i天把所有的n天的股票分开,用left[i]和right[i]表示以第i天分开之后允许买卖一次的最大收益,在左边[0,i]和右边[i+1,len-1]的股票中分别至多买卖一次的收益,即题目转化为用动态规划求在m天内最多只允许买卖一次股票的最大收益。然后比较求得left[i]和right[i]和的最大值。

/*** 计算你能获得的最大收益.* 已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。* 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0* * @param prices Prices[i]即第i天的股价* @return 整型*/public int calculateMax(int[] prices) {int len = prices.length;/*left[i]和right[i]表示以第i天分开,在左边[0,i]和右边[i+1,len-1]的股票中分别至多买卖一次的收益,* 即题目转化为用动态规划求在m天内最多只允许买卖一次股票的最大收益*/int[] left = new int[len];int[] right = new int[len];int max = 0;//表示整体的最后整体收益for(int i=0;i<len;i++){left[i] = maxProfit(prices,0,i);right[i] = maxProfit(prices,i+1,len-1);if(max <= left[i]+right[i]){max = left[i]+right[i];}}return max;    	}/*** 计算在数组prices的下标[start,end]对应的股票最多允许买卖一次的最大收益.* 采用动态规划的思想,同leetcode中51.Best Time to Buy and Sell Stock(动态规划)* */public int maxProfit(int[] prices,int start,int end) {int len = end  - start + 1;if(len<=1){return 0;}int sum = 0;//sum表示目前已经p[0..i-1]满足条件的最大收益int high = prices[start];//low 和 high表示目前已经p[0..i-1]满足条件的买卖价格int low = prices[start];for(int i =start+1;i<=end;i++){if(prices[i]>high){//如果新的prices[i]比high大,则将其置为新的highhigh = prices[i];}else if(prices[i]<low){//prices[i]比low小,则将其置为新的high和lowhigh = prices[i];low = prices[i];}if(sum < high - low){//拿之前的sum和新生成的high-low的值进行比较,决定是否更新sum的值sum = high - low;}}return sum;}

这篇关于51.Best Time to Buy and Sell Stock(动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981198

相关文章

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d