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 ...
随机推荐
- hdu 4747 Mex
http://acm.hdu.edu.cn/showproblem.php?pid=4747 设我们输入的数组为 a[],我们需要从 1 到 n 遍历, 假设遍历到 i 时, 遍历的过程中用b[j]表 ...
- IIS调试技巧
VS2010如何调试IIS上的网站 通常,我们在Visual Studio里调试ASP.NET网站,都是加个断点,然后按F5,在VS自带的虚拟服务器下调试的.但有时候,VS自带的服务器弱爆了,无法满足 ...
- AsyncTask异步交互
package com.baidu.day06asynctask; import java.util.ArrayList; import java.util.List; import com.baid ...
- poj1502 spfa最短路
//Accepted 320 KB 16 ms //有n个顶点,边权用A表示 //给出下三角矩阵,求从一号顶点出发到各点的最短路的最大值 #include <cstdio> #includ ...
- 数据库连接JDBC和数据库连接池C3P0自定义的java封装类
数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...
- Opencv 2.4.10 +VS2010 项目配置记录
http://blog.csdn.net/scottly1/article/details/40978625?utm_source=tuicool 因为工作需要,小小的研究一下Opencv的图像处理, ...
- Nested List Weight Sum -- LeetCode 339
Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...
- 图片过大导致OOM
原文:http://www.codeceo.com/article/android-load-image-oom.html 一.分析 在加载图片过程中出现的OOM的几种情况: 1. 加载的图片过大 2 ...
- 使用Template控制Editor显示方式
@Html.EditorFor可以由Template决定显示 虽然都是EditorFor,页面上显示却不同,ReleaseDate是一个Jquery DatePicker: 怎么实现的呢?就是Temp ...
- 设置ASP.NET页面的运行超时时间详细到单个页面及站点
这篇文章主要介绍了如何设置ASP.NET页面的运行超时时间,包括全局超时时间.单个站点超时时间.单个页面请求超时时间,需要的朋友可以参考下 全局超时时间 服务器上如果有多个网站,希望统一设置一 ...