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

相关文章

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

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. 灵活性与可