• [LeetCode in Python] 1345 (H) jump game iv 跳跃游戏 IV


    题目

    https://leetcode-cn.com/problems/jump-game-iv/solution/

    给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。

    每一步,你可以从下标 i 跳到下标:

    i + 1 满足:i + 1 < arr.length
    i - 1 满足:i - 1 >= 0
    j 满足:arr[i] == arr[j] 且 i != j
    请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。

    注意:任何时候你都不能跳到数组外面。

    示例 1:

    输入:arr = [100,-23,-23,404,100,23,23,23,3,404]
    输出:3
    解释:那你需要跳跃 3 次,下标依次为 0 --> 4 --> 3 --> 9 。下标 9 为数组的最后一个元素的下标。

    示例 2:

    输入:arr = [7]
    输出:0
    解释:一开始就在最后一个元素处,所以你不需要跳跃。

    示例 3:

    输入:arr = [7,6,9,6,9,6,9,7]
    输出:1
    解释:你可以直接从下标 0 处跳到下标 7 处,也就是数组的最后一个元素处。

    示例 4:

    输入:arr = [6,1,9]
    输出:2

    示例 5:

    输入:arr = [11,22,7,7,7,7,7,7,7,22,13]
    输出:3

    提示:

    1 <= arr.length <= 5 * 10^4
    -10^8 <= arr[i] <= 10^8

    解题思路

    • 先用字典存储数组值及下标列表
    • 对于连续出现的字符,如“77...77”这样的情况,只记录首尾,跳过中间,否则TLE
    • 其余就是标准BFS流程了

    代码

    class Solution:
        def minJumps(self, arr: List[int]) -> int:
            g = defaultdict(list)
            for i,a in enumerate(arr):
                # - key optimization
                # - skip continous value, such as '77...77', only keep first and last 7
                if (i > 0) and (i < len(arr) - 1) and (a == arr[i-1] == arr[i+1]):
                    continue
    
                g[a].append(i)
    
            seen_set = set([0])
            q = [(0,0)]
            step = 0
            while q:
                p, step = q.pop(0)
    
                # - check if touch the end
                if p == len(arr) - 1:
                    return step
                
                for k in [p-1, p+1] + g[arr[p]]:
                    if k in seen_set: continue
    
                    if 0 <= k <= len(arr)-1:
                        seen_set.add(k)
                        q.append((k, step+1))
            
            return 0
    
  • 相关阅读:
    Matlab之画图
    Evaluation
    Matlab之文件读写
    Matlab之cell使用
    Windows装机指南
    C之文件读写
    Linux之用户管理
    linux和Windows下文本格式转换
    round()
    pow()
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/12729724.html
Copyright © 2020-2023  润新知