题目:
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 (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
Note that you cannot sell a stock before you buy one.
Example 1:
Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 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
Explanation: In this case, no transaction is done, i.e. max profit = 0.
题解:
1、初始化数组的第一个元素为最低价格
2、从左到右遍历,更新最低价格,更新最大收益值
代码如下:
public class BestTimetoBuyandSellStock {
public static void main(String[] args) {
/**
* 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 (i.e., buy one
* and sell one share of the stock), design an algorithm to find the maximum
* profit.
*
* Note that you cannot sell a stock before you buy one.
*
* Example 1:
*
* Input: [7,1,5,3,6,4] Output: 5 Explanation: Buy on day 2 (price = 1) and sell
* on day 5 (price = 6), profit = 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 Explanation: In this case, no transaction is
* done, i.e. max profit = 0.
*/
System.out.println(maxProfit(new int[] { 7, 1, 5, 3, 6, 4 }));
System.out.println(maxProfit(new int[] { 7, 6, 4, 3, 1 }));
}
public static int maxProfit(int[] prices) {
if (prices == null || prices.length <= 1) {
return 0;
}
int min = prices[0], profit = 0;
for (int i = 1; i < prices.length; i++) {
min = Math.min(min, prices[i-1]);
profit = Math.max(prices[i] - min, profit);
}
return profit;
}
}