121. 买卖股票的最佳时机
题目:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
- 穷举 O(n^2)
for buy in 0..len(price_at)-1
for sell in buy+1..len(price_at)-1
ans = max(price_at[sell] - price_at[but]);
- O(n)
穷举每次都去找buy..len(priceAt)-1之间哪一天卖掉的最大值, 这个信息可以记录下来
for i in len(price_at)-1..0
max_so_far = max(max_so_far, priceAt[i])
max_from[i] = max_so_far
for buy in 0..len(price_at)-1
ans = max(ans, max_from[buy] - price_at[buy])
- O(n)
把股票价格转换成价格波动,求最大连续子序列的和
for i in 0..len(price_at)-1
if i == 0
then diff[i] = 0
else diff[i] = price_at[i] - price_at[i-1]
dp[0] = 0;
for i in 1..len(price_at)-1
// dp[i]表示以i结尾的最大连续子序列的和
// dp可以用单个变量表示
dp[i] = max(dp[i-1]+price_at[i], price_at[i])
ans = max(ans, dp[i])
- 为什么2和3的复杂度相同
dp[i] = price_at[i] - min(x in 0..i -> price_at[x])
令
mp[i] = min(x in 0..i -> price_at[x])
mp[i] = min(price_at[i], mp[i-1])
则
mp[i] = min(price_at[i], mp[i-1])
dp[i] = price_at[i] - mp[i]
2可以改写成
for i in 0..len(price_at)-1
mp[i] = min(price_at[i], mp[i-1])
dp[i] = price_at[i] - mp[i]
ans = max(ans, dp[i])
- 最大连续子序列和是如何得到最优解的?
最大连续子序列最直观的解法是max(S[i][j])
是否可以简化为一维问题?
尝试代换的方式,没有想出来
或许修改定义也是一种降维的方法?
ans = max(sumEndAt[j])
sumEndAt[j]定义为j结尾的最大连续子序列和
从max(S[i][j])到max(sumEndAt[j])中间是否存在连续的证明步骤?