• 边工作边刷题: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的数是不是一个素数
    luogu P3241 [HNOI2015]开店
    换根DP
    CF1187E Tree Painting
    luogu P3345 [ZJOI2015]幻想乡战略游戏
    费用流
    FZOJ 4112 脱单计划
    计数DP
    FZOJ 4109 青青草原的表彰大会
    状压DP
  • 原文地址:https://www.cnblogs.com/absolute/p/5678187.html
Copyright © 2020-2023  润新知