题目描述:
Say you have an array for which the ith element is the price of a given stock on dayi.
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.
只能进行一次交易,而且卖出必须在买入之后,所以应该选取i<j,使得prices[j]-prices[i]的值最大。最简单的方法是用两层循环求出当i<j时,prices[j]-prices[i]的最大值,但是这种方法时间复杂度为O(n^2),更高效的方法是从i=0开始扫描数组,保存当前的最小值min,然后对于每个i求出prices[i]-min,返回它们的最小值即可,这是因为当prices[i]不是当前最小值时,计算prices[j]-prices[i]的值是没有意义的,不考虑这些情况可以简化运算步骤,时间复杂度为O(n)。
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int n=prices.size();
int min=0xFFFF;
int result=0;
for(int i=0;i<n;i++)
{
if(result<(prices[i]-min)) result=prices[i]-min;
if(min>=prices[i]) min=prices[i];
}
return result;
}
};