121— Best Time to Buy and Sell Stock
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.
Example1:
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.
Example2:
Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.
思路1:
- 暴力求解, 使用两层循环遍历所有的可能.
- Leetcode提交超时(Time Limit Exceeded)
C++代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int in,out;
int dif = 0;
for(int in = 0; in < prices.size() - 1; in++) {
for(int out = in+1 ; out < prices.size(); out++) {
if(prices[out]-prices[in] > dif ) dif = prices[out]-prices[in];
}
}
return dif;
}
};
Complexity Analysis:
Time complexity : O(n2n^{2}n2).
Space complexity : O(111).
思路2:
- 实质上就是确定两个极值. 确保极大值在极小值后面即可.
C++代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int currentMin = INT_MAX,currentDif = 0;
for(int i = 0; i< prices.size();i++) {
if(prices[i] < currentMin) currentMin = prices[i];
else if(prices[i] - currentMin > currentDif) currentDif = prices[i] - currentMin;
}
return currentDif;
}
};
Complexity Analysis:
Time complexity : O(nnn).
Space complexity : O(111).
思路3:
- 动态规划思想, 对于第n天最大利润为max(第n-1天时最大利润, 第n天价格 - 当前最低价格).
C++代码:
int maxProfit(vector<int>& prices) {
int len = prices.size();
if(len < 2) return 0;
vector<int> table(len,0);
int currentMin = prices[0];
for(int i = 1; i < len; i++) {
if(currentMin > prices[i]) currentMin = prices[i];
table[i] = max(table[i-1],prices[i]-currentMin);
}
return table[len-1];
}
Complexity Analysis:
Time complexity : O(nnn).
Space complexity : O(nnn).