边工作边刷题:70天一遍leetcode: day 33-4
Jump Game II
要点:dp比较容易想,但更好的办法是1d bfs,因为每一步可以走任何小于步长上限的步数。对应的边界是连续扩大的。所以如果边界超过终点,就能得到步数。
- start和end的关系:end表示上一轮能reach到的点,内循环的start将走到上上一轮end,也就是已经检查过的点。因为start和end中间任何一个点已经可以reach到了,在本轮,start将走到end,来检查是否某个点可以继续扩大reach到下一轮。注意start是不根据轮数重置的,因为每个点都要检查。
- 这题start/end的变化和text justification很像,都是一种pagination的思路。唯一的差异就是对于text justification,下一轮的end是在下一轮确定的,只要start还在界内就有下一轮,所以start作为条件。而本题,下一轮的end是在本轮确定,而只要end超界,就不用走下一轮了,所以end作为条件。
错误点
- 根据上面的要点,下一轮的start是old end+1,而不是new end+1
- step初始为0,所以invariant是end<n-1(注意到达最后一个点而非超过也算)。step++在循环内哪里都可以因为没有提前的return
class Solution(object):
def jump(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
start,end = 0,0
step = 0
while end<len(nums)-1:
reach = 0
for i in range(start, end+1):
if nums[i]+i>reach:
reach = nums[i]+i
start=end+1
end=reach
step+=1
return step