27. Best Time to Buy and Sell Stock && Best Time to Buy and Sell Stock II && Best Time to Buy and Sell Stock III
Best Time to Buy and Sell Stock
(onlineJudge: https://oj.leetcode.com/problems/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.
注意: 限制条件: 先买后卖(不同天)。
思想: 买了后,1. 若以后价格不变,不买不卖。 1. 更价格低,重新买。2. 价格升高,假定抛售,更新一下利润值。
class Solution {
public:
int maxProfit(vector<int> &prices) {
int buy = 0x7fffffff, maxProfile = 0;
for(int i = 0; i < prices.size(); ++i) {
if(prices[i] == buy) continue;
if(prices[i] < buy) { buy = prices[i]; continue; }
else maxProfile = max(maxProfile, prices[i]-buy);
}
return maxProfile;
}
};
Best Time to Buy and Sell Stock II
(onlineJudge:https://oj.leetcode.com/problems/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 (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
思想:求出所有非递减序列两端绝对值之和。我贴在 leedcode 的代码和证明:
class Solution {
public:
int maxProfit(vector<int> &prices) {
int n = prices.size();
if(n == 0) return 0;
int start = 0, profile = 0;
for(int i = 1; i < n; ++i) {
if(prices[i] < prices[i-1]) {
profile += prices[i-1] - prices[start];
start = i;
}
}
profile += prices[n-1] - prices[start];
return profile;
}
};
/*********************** *provement ***************/
/*Explain the code I pasted above:
From left to right I find out every subsequence that not exist decrease.
such as: l ... k1 ...k2 ... h (l <=...<= k1 <= ... k2 <= ... <= h)
In this sequence: ( k1-l ) + ( h-k2 ) = ( h-l ) - ( k2-k1 ) <= ( h-l );
So (h - l) will be the maximum profit in this days.
Another case:
L1 ...d1... H1 K2 ...k... K3 L2 ...d2... H2 (L1 <=... H1 > K2 >=...k >=... K3 > L2 <=... H2 )
K2 ... K3 is not exist increase sequence.
then for any k in that position,
( k-d1 ) + ( d2-k ) <= ( K2-L1 ) + ( H2-K3 ) < ( H1-L1 ) + ( H2-L2 )
In my code, variant "start" is the start of every no decrease sequence.*/
A little Adjustment.
class Solution {
public:
int maxProfit(vector<int> &prices) {
int start = 0, profile = 0;
for(size_t i = start+1; i < prices.size(); ++i) {
if(prices[i] < prices[i-1]) {
profile += prices[i-1] - prices[start];
start = i;
}
else if(i+1 == prices.size())
profile += prices[i] - prices[start];
}
return profile;
}
};
Best Time to Buy and Sell Stock III
(onlineJudge: https://oj.leetcode.com/problems/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).
思想:动态规划。 记录下从各位置(含)开始之前的最大利润和此时开始到最后的最大利润。
class Solution {
public:
int maxProfit(vector<int> &prices) {
vector<int> preProfile(prices.size()+2, 0), postProfile(prices.size()+2, 0);
int minPrice = 0x7fffffff;
for(size_t i = 1; i <= prices.size(); ++i) {
minPrice = min(minPrice, prices[i-1]);
preProfile[i] = max(prices[i-1] - minPrice, preProfile[i-1]);
}
int maxPrice = 0;
for(int i = prices.size(); i >= 1; --i) {
maxPrice = max(maxPrice, prices[i-1]);
postProfile[i] = max(maxPrice - prices[i-1], postProfile[i+1]);
}
int maxProfile = 0;
for(size_t i = 1; i <= prices.size(); ++i)
maxProfile = max(maxProfile, preProfile[i] + postProfile[i]);
return maxProfile;
}
};
27. Best Time to Buy and Sell Stock && Best Time to Buy and Sell Stock II && Best Time to Buy and Sell Stock III的更多相关文章
- [Swift]LeetCode122. 买卖股票的最佳时机 II | 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 al ...
- [Leetcode 122]买股票II 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 ...
- [LeetCode 122] - 买入与卖出股票的最佳时机II(Best Time to Buy and Sell Stock II)
问题 假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格. 设计一个算法找出最大的利润值.你可以进行任意多次的交易(即多次的卖出并买入一份股票).你不能在同一时间进行多次交易(即你必须在再次 ...
- [LeetCode] Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- [LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- [LeetCode] 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 al ...
- Best Time to Buy and Sell Stock with Cooldown
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
- Best Time to Buy and Sell Stock系列
I题 Say you have an array for which the ith element is the price of a given stock on day i. If you we ...
随机推荐
- 5、Linux下面桌面的安装
搭建本地yum仓库的方法 http://www.cnblogs.com/lql123/p/5952788.html 1.yum grouplist (列出yum仓库里的软件组列表) .y ...
- myeclipse中文乱码,JSP页面乱码
一.设置新建常见文件的默认编码格式,也就是文件保存的格式.在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致, ...
- quartz.net 使用(一)-执行定时计划任务
一.使用nuget安装所需要的包 Install-Package Quartz 二.实现自己的job继承IJob public class FirstJob : IJob { public void ...
- js 点击复制内容
<textarea id="pushUrlsTxt" rows="5" cols="55"></textarea> ...
- 18、(番外)匿名方法+lambda表达式
概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿 ...
- ubuntu14.04 安装 bcm43142无线网卡
thinkpad e430c 在安装ubuntu14.04时无法识别无线网卡 用命令lspci 查看无线网卡类型 然后下载对应的无线网卡驱动. 之后,使用下列命令安装,即可搜索无线热点了: sudo ...
- python实现拷贝指定文件到指定目录
python实现这个功能非常简单,因为库太强大了 import os import shutil alllist=os.listdir(u"D:\\notes\\python\\资料\\&q ...
- Socket编程基础——面向连接TCP
WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock ...
- thinking in Java 学习
1.句柄 所谓句柄实际上是一个数据,是一个long的数据. 句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图, ...
- jq 文字上下不间断滚动实例
<div class="ruzhuright"> <div class="rzcontent"> ...