122.买卖股票的最佳时机II
本题的解法比较巧妙。
利润是可以分解的,例如第0天买入股票,第三天卖出,则利润为:
P[3]-P[0] = (P[3]-P[2])+(P[2]-P[1])+(P[1]-P[0])
本题只要求最大的总利润,因此不需要关注究竟第一天买入第几天卖出,只需算出每天的利润并收集正利润就行了
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
res = 0
for i in range(1, len(prices)):
m = prices[i]-prices[i-1]
if m > 0:
res += m
return res
55. 跳跃游戏
这道题只问我们能不能到达末尾,所以同样不需要关注每次怎么跳,只要关注跳跃的覆盖范围能不能到达终点就行了。
class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
cover = 0 # 覆盖范围
i = 0
if len(nums) == 1:
return True
while i <= cover: # i只能在cover之内移动才有意义
cover = max(i+nums[i], cover) # 更新最大的覆盖范围
if cover >= len(nums)-1:
return True
i += 1
return False
45.跳跃游戏II
这题就感觉比上一题难很多了。
仍然从覆盖范围出发,覆盖范围内一定可以跳到。
移动下标i走到覆盖范围的最远端时,若还没到终点,就需要再跳一步,启动下一层覆盖范围。
class Solution(object):
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
cur = 0 # 当前覆盖范围
next = 0 #下一个覆盖范围
res = 0
if len(nums) == 1:
return 0
for i in range(len(nums)):
next = max(i+nums[i], next) # 不断更新下一步最大覆盖范围的最远下标
if i == cur: # 每次达到当前最远下标,且还没有到达终点,就需要再跳一次
res += 1
cur = next # 更新当前覆盖最远距离下标
if next >= len(nums)-1: # 盖到终点了,肯定能跳到了,不需要再加步数了
break
return res
贪心真的很难想到啊