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的更多相关文章

  1. [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 ...

  2. [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 ...

  3. [LeetCode 122] - 买入与卖出股票的最佳时机II(Best Time to Buy and Sell Stock II)

    问题 假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格. 设计一个算法找出最大的利润值.你可以进行任意多次的交易(即多次的卖出并买入一份股票).你不能在同一时间进行多次交易(即你必须在再次 ...

  4. [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 ...

  5. [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 ...

  6. [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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. Linux gcc 编译日记

    gcc 编译器是众多编译器组合入口,例如在编译 .cpp 文件时,使用c++ 编译器,编译.c 文件时,使用c编译器. 在编译c++程序时, 库文件与头文件可通过 -L[dir] 指定库目录 , -l ...

  2. JavaScript 语句

    JavaScript 语句 JavaScript 语句向浏览器发出的命令.语句的作用是告诉浏览器该做什么. JavaScript 语句 JavaScript 语句是发给浏览器的命令. 这些命令的作用是 ...

  3. js 判断数据类型的方法及实现

    转载自 http://blog.csdn.net/xujiaxuliang/archive/2009/10/21/4708353.aspx null 与 undefined 区别: null 是js的 ...

  4. Android 命令管理项目

    今天介绍一下Android怎么用命令管理项目,用命令管理Android项目需要用到Android命令,首先介绍一下用Android命令创建新项目,打开命令提示窗口,导航到Android SDK 的to ...

  5. UIRefreshControl自动刷新

    不知道UIRefreshController是什么的朋友可以参考iOS6新特征:UIRefreshControl[下拉刷新]使用示例 一文了解这是什么,这里只提怎么使用代码的方式触发UIRefresh ...

  6. How do I uninstall Java 7 and later versions on my Mac?

    How do I uninstall Java 7 and later versions on my Mac? http://www.java.com/en/download/help/mac_uni ...

  7. cassandra CQL 常用操作

    1. CQL客户端链接 bin/cqlsh ip username password 2. (1)建立keyspace语句,keyspace类似于 mysql 中的数据库,一个数据库中可以有很多表: ...

  8. readfile() 函数

    定义和用法 readfile() 函数输出一个文件. 该函数读入一个文件并写入到输出缓冲. 若成功,则返回从文件中读入的字节数.若失败,则返回 false.您可以通过 @readfile() 形式调用 ...

  9. LayaAir引擎——(一)

    LayaAir是LayaBox推出的Html5游戏引擎,支持 ActionScript3.TypeScript.JavaScript,开源,并且商用免费.   LayaAir IDE 是一款使用Lay ...

  10. Ubuntu 14.04下安装Hadoop2.4.0 (单机模式)

    转自 http://www.linuxidc.com/Linux/2015-01/112370.htm 一.在Ubuntu下创建Hadoop组和hadoop用户 增加hadoop用户组,同时在该组里增 ...