Solution 1
整体来看感觉像是动态规划,但是由于整体的状态保留和利用十分简单,可以直接简化到贪心思路:
- 每一天的最大获利只会跟前面最小报价相关
- 当我们获得了一个更小的报价的时候,前面的历史最小报价
因此每遍历一天,需要检查两个情况即可:
- 当天收益是否为最大收益?
- 当前的报价是否是新的最低报价?(若是新的最低,当天必然不会是最大收益,一个if-else)
这样到最后就能获得最理想报价。由于数据无序,必须全部遍历。
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为输入序列的长度
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态量
class Solution {
public:
int maxProfit(vector<int>& prices) {
int min_price = INT_MAX;
int max_profit = 0;
for (auto price: prices) {
if (price < min_price) {
min_price = price;
} else if (price - min_price > max_profit) {
max_profit = price - min_price;
}
}
return max_profit;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def maxProfit(self, prices: List[int]) -> int:
min_price = None
max_profit = 0
for price in prices:
if min_price is None or price < min_price:
min_price = price
elif price - min_price > max_profit:
max_profit = price - min_price
return max_profit