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
将n天分为前i天和后n-i天,维护两个数组,记录前i天的最小价格和后n-i天的最大价格,随后相减寻找最大值
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==0) return 0;
int n=prices.size();
int max[n]={0};
int min[n]={0};
int c[n]={0};
int i;
min[0]=prices[0];
max[n-1]=prices[n-1];
for(i=1;i<n;i++)
{
min[i]=min[i-1];
if(prices[i]<min[i])
{
min[i]=prices[i];
}
max[n-1-i]=max[n-i];
if(prices[n-1-i]>max[n-1-i])
{
max[n-1-i]=prices[n-1-i];
}
}
int ans=0;
for(i=0;i<n;i++)
{
int profit=max[i]-min[i];
if(ans<profit)
ans=profit;
}
return ans;
}
};
一次遍历,仅需要维护最小价格和收益两个变量。
首先判断当天与之前最小价格之间的关系,判断是否需要更新最小价格。
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==0) return 0;
int n=prices.size();
int min=prices[0];
int ans=0;
int i;
for(i=1;i<n;i++)
{
if(prices[i]<min)
min=prices[i];
int fit=prices[i]-min;
if(fit>ans)
ans=fit;
}
return ans;
}
};
其次判断当天价格减去最小价格的大小,判断是否需要更新收益。