121. 买卖股票的最佳时机

题目:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/

  1. 穷举 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]);
  1. 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])
  1. 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])
  1. 为什么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])
  1. 最大连续子序列和是如何得到最优解的?
    最大连续子序列最直观的解法是max(S[i][j])
    是否可以简化为一维问题?
    尝试代换的方式,没有想出来
    或许修改定义也是一种降维的方法?
    ans = max(sumEndAt[j])
    sumEndAt[j]定义为j结尾的最大连续子序列和

从max(S[i][j])到max(sumEndAt[j])中间是否存在连续的证明步骤?

posted @ 2023-02-20 23:08  rxh1999  阅读(11)  评论(0编辑  收藏  举报