121. Best Time to Buy and Sell Stock
Description:
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.
想要求出最大利益,有两种解题思路。
思路一:
用两重循环遍历所有可能的交易,求出最大利益,时间复杂度为O(n^2)。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0) return 0;
int maxProfit = 0;
for(int i = 0; i < prices.size(); i++) {
for (int j = i+1; j < prices.size(); j++) {
if (prices[j]-prices[i] > maxProfit)
maxProfit = prices[j]-prices[i];
}
}
return maxProfit;
}
};
思路二:
维护一个当前最大利益maxProfit以及最小值minPrice,只需遍历一次即可求出最大利益,时间复杂度为O(n)。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0) return 0;
int maxProfit = 0;
int minPrice = prices[0];
for (int i = 1; i < prices.size(); i++) {
maxProfit = max(maxProfit, prices[i]-minPrice);
minPrice = min(minPrice, prices[i]);
}
return maxProfit;
}
};