LeetCode解题 121:Best Time to Buy and Sell Stock
Problem 121: Best Time to Buy and Sell Stock [Easy]
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.
来源:LeetCode
解题思路
本题只需遍历一遍数组,维护一个当前最小价格变量和一个当前最大利润变量。由于每个价格都只能与其之前的价格产生利润,因此只需要在遍历过程中不断更新最小价格,并计算当前价格与其的差值是否能够产生更大的收益。
具体过程:
- 创建minp变量和maxP变量。
- 遍历数组,更新最小价格minp和最大利润maxP,公式为:
m i n p = min { m i n p , p r i c e s [ i ] } m a x P = max { m a x P , p r i c e s [ i ] − m i n p } minp = \min\{minp, prices[i]\}\\ maxP = \max\{maxP, prices[i] - minp\} minp=min{minp,prices[i]}maxP=max{maxP,prices[i]−minp}
其中 p r i c e s [ i ] prices[i] prices[i]为当前价格。 - 最后返回最大利润值maxP。
时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
运行结果:
Solution (Java)
class Solution {
public int maxProfit(int[] prices) {
int N = prices.length;
if(N < 2) return 0;
int minp = prices[0];
int maxP = 0;
for(int i = 1; i < N; i++){
minp = Math.min(minp, prices[i]);
maxP = Math.max(maxP, prices[i] - minp);
}
return maxP;
}
}