1014. 最佳观光组合
1、还是没有思路,想要递归
2、看了答案居然是把式子拆开看。
res = A[i] + A[j] + i - j (i < j)
(1)我们可以计算出A[j] - j
(2)我们也可以计算出 A[i]+i
(3)计算以j为结尾的每一组res,最后取最大值
3、不过这个和递归有啥关系呢?
4、超出时间限制
class Solution:
def maxScoreSightseeingPair(self, values: List[int]) -> int:
n = len(values)
sum_value = [0]*n
sub_value = [0]*n
res = [0]*n
for index,value in enumerate(values):
# 得到values[i]+i
sum_value[index] = index+value
# 得到values[j]-j
sub_value[index] = value-index
for j in range(1,n):
res[j] = sub_value[j] + max(sum_value[:j])
return max(res)
应该是for循环太多了
5、
class Solution:
def maxScoreSightseeingPair(self, values: List[int]) -> int:
n = len(values)
res = [0]*n
max_sum = 0
for index,value in enumerate(values[1:]):
# 记录到j的最大的values[i]+i
max_sum = max(index+values[index],max_sum)
# 得到values[j]-j
res[index+1] = value-index-1 + max_sum
return max(res)
修改了一下,就可以了。
本题的动态规划体现在values[i]+i的计算上,我们不需要把每一个计算结果都储存起来,我们只需要储存j之前的最大值即可。在遍历过程中,不断计算values[i]+i,将最大值储存起来。
注意:j的index从1开始。
121. 买卖股票的最佳时机
1、这题与上一题的思路类似。将数组遍历一遍,每次记录在j之前的最小值,然后计算prices[j]-min,储存在res数组中,最后返回max(res)
2、
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
pre_min = max(prices)
res = [0]*n
for index, value in enumerate(prices[1:]):
pre_min = min(pre_min,prices[index])
res[index+1] =value-pre_min
return max(res)
通过了~
122. 买卖股票的最佳时机 II
1、没有想法了
2、看了答案后:这和递归有啥关系???难道动态规划不止递归吗???
3、该题主要思路:连续上涨日最大利润=最后一天-第一天,中间的都消了。为了统一,也可以写成后一天-前一天。所以购买策略为:后一天比前一天高,则买;反之,则不买。
4、
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
profits = 0
for i in range(1,n):
profit = prices[i]-prices[i-1]
if profit>0:
profits = profits + profit
return profits
啊这啊这这么简单的嘛???