边工作边刷题: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
        
posted @ 2016-04-15 11:30  absolute100  阅读(114)  评论(0编辑  收藏  举报