zoukankan      html  css  js  c++  java
  • 边工作边刷题: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
            
    
  • 相关阅读:
    团队开发冲刺日(十三)
    第十周总结
    团队开发冲刺日(十二)
    团队开发冲刺日(十一)
    团队开发冲刺日(十)
    团队开发冲刺日(九)
    团队开发冲刺日(八)
    团队开发冲刺日(七)
    团队开发冲刺日(六)
    课后作业1
  • 原文地址:https://www.cnblogs.com/absolute/p/5678187.html
Copyright © 2011-2022 走看看