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.
Example 1:
Input: [7, 1, 5, 3, 6, 4] Output: 5 max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)
Example 2:
Input: [7, 6, 4, 3, 1] Output: 0 In this case, no transaction is done, i.e. max profit = 0.
给出股票走势曲线,求最大收益。
思路:
将每个间隔时间段的差额求出,即可变为求最大连续子字段和问题。
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit=0,maxn=0;
int n=prices.size();
if(n==0)
return 0;
int a[n];
for(int i=0;i+1<n;i++)
{
a[i]=prices[i+1]-prices[i];
if(profit<=0)
profit=a[i];
else
profit+=a[i];
maxn=max(profit,maxn);
}
return maxn;
}
};
更新———
看到一种超级简洁的解法,或许这才是题目希望我们用的。
思路:设置profit[0],表示买入股票时最高的利润,profit[1]表示卖出股票时最高的利润。
那么可以发现动态转移方程,profit[0]=max(profit[0],-prices[i]),profit[1]=max(profit[1],profit[0]+prices[i])。最后求profit[1]即可。真是66666啊!注意初始化的问题。
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
// int profit=0,maxn=0;
// if(n==0)
// return 0;
// int a[n];
// for(int i=0;i+1<n;i++)
// {
// a[i]=prices[i+1]-prices[i];
// if(profit<=0)
// profit=a[i];
// else
// profit+=a[i];
// maxn=max(profit,maxn);
// }
// return maxn;
int profit[2]={INT_MIN,0};
for(int i=0;i<n;i++)
{
profit[1]=max(profit[1],profit[0]+prices[i]);
profit[0]=max(profit[0],-prices[i]);
}
return profit[1];
}
};