博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[leetcode]股票题型123
阅读量:6095 次
发布时间:2019-06-20

本文共 2687 字,大约阅读时间需要 8 分钟。

 122. Best Time to Buy and Sell Stock II

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

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).

Note: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).

分析:主要是寻找数组中的递减子数组,及递增子数组(或者可以认为是极值点),然后求和即可。

class Solution {public:    int maxProfit(vector
& prices) { int size = prices.size(); if (size <= 1) return 0; int index = 0; int profit = 0; while(index < size) { int buy,sell; while(index+1 < size && prices[index] > prices[index+1]) index++; buy = index; while(index+1 < size && prices[index]< prices[index+1]) index++; sell = index; profit += prices[sell] - prices[buy]; index++; } return profit; }};

 

 

123. Best Time to Buy and Sell Stock III

 

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

Design an algorithm to find the maximum profit. You may complete at most two transactions.

Note:

You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

动态规划preprofit保存i之前交易获得的收益postprofit保存i之后交易获得的收益

 

只能进行两次交易,在第0-i天,我进行一次交易,在第i天后我进行一次交易。 

  • preprofit保存,从开始那天到第i天,如果我进行交易的最大值,从max{preprofit[i-1],price[i]-curmin}获得。

  从前往后扫:因为我要获得arr[0,..i](i++)包含i的最大收益:

          1.要找到0-i的最小值,curmin需要更新

          2.最大收益即之前的preprofit和当前price-curmin作对比。

  • postprofit保存,从第i天到最后一天,如果我进行交易的最大值,从max{postprofit[i-1],curmax-postprofit[i]}获得。

  从后往前扫描:因为我要获得arr[i+1……n](i++)的最大收益

          1.要找到i+1~n的最大值,如果不是从后往前扫,而是从前往后扫,curmax保存的是0-i的最大值。而我们要找的是i+1~n的最大值。

          2.最大收益即之后postprofit和当前的curmax-price做对比。

整个算法是这样的:是把整个数组分两段Max( MaxProfitOn[0,i] + MaxProfitOn[i+1, n-1] ),分别找最大,看看他们的和在如何分的时候才能达到全局最大。

  

最后遍历preprofit和postprofit数组,max{preprofit[i]+postprofit[i]}既是最大的可能收益。

class Solution {public:    int maxProfit(vector
& prices) { int size=prices.size(); if (size<2) return 0; int curmin=prices[0],curmax=prices[size-1]; vector
preProfit(size,0); vector
postProfit(size,0); for(int i=1;i
=0; --j){ curmax=max(curmax,prices[j]); postProfit[j]=max(postProfit[j+1],curmax-prices[j]); } int retProfit=0; for(int m=0;m

 

转载于:https://www.cnblogs.com/LUO77/p/5631768.html

你可能感兴趣的文章
记一次eclipse无法启动的排查过程
查看>>
【转】jmeter 进行java request测试
查看>>
读书笔记--MapReduce 适用场景 及 常见应用
查看>>
SignalR在Xamarin Android中的使用
查看>>
走过电竞之路的程序员
查看>>
Eclipse和MyEclipse使用技巧--Eclipse中使用Git-让版本管理更简单
查看>>
[转]响应式表格jQuery插件 – Responsive tables
查看>>
8个3D视觉效果的HTML5动画欣赏
查看>>
C#如何在DataGridViewCell中自定义脚本编辑器
查看>>
【linux】crontab定时命令
查看>>
Android UI优化——include、merge 、ViewStub
查看>>
Office WORD如何取消开始工作右侧栏
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Android Annotation扫盲笔记
查看>>
React 整洁代码最佳实践
查看>>
聊聊架构设计做些什么来谈如何成为架构师
查看>>
Java并发编程73道面试题及答案
查看>>