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.
题意:用一个数组表示股票每天的波动价格,如果你只有一次买卖的机会,那么你能赚到的最大利润是多少。
思路:
第一种思路,是以每个价格作为买入价格,然后再它后面找最高的卖出价格,通过两次循环可以算出,时间复杂度是n方。
第二种思路,实际上每个价格都作为买入价格是不必要的,比如[2,3,9,20],3和9都比2大,所以以3和9作为买入价格,肯定没有以2获取的利润多。由此想到只需要知道当前最低的买入价格,如果当前价格比最低价格还低,那么更新最低价格;如果比最低价格高,那么算一下以当前价格作为卖出价格的利润,再与最大利润值比较。
public int maxProfit(int[] prices) {
if (prices == null || prices.length < 2) {
return 0;
}
int curMin = prices[0];
int profit = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] > curMin) {
profit = Math.max(profit, prices[i] - curMin);
} else {
curMin = prices[i];
}
}
return profit;
}