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

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指