LeetCode_1345. 跳跃游戏_2022_01_21
1345. 跳跃游戏 IV
给你一个整数数组 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
Solution
Language: ****
func minJumps(arr []int) int { n := len(arr) idx := map[int][]int{} for i, v := range arr { idx[v] = append(idx[v], i) } vis := map[int]bool{0: true} type pair struct{ idx, step int } q := []pair{{}} for { p := q[0] q = q[1:] i, step := p.idx, p.step if i == n-1 { return step } for _, j := range idx[arr[i]] { if !vis[j] { vis[j] = true q = append(q, pair{j, step + 1}) } } delete(idx, arr[i]) if !vis[i+1] { vis[i+1] = true q = append(q, pair{i + 1, step + 1}) } if i > 0 && !vis[i-1] { vis[i-1] = true q = append(q, pair{i - 1, step + 1}) } } } 作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/jump-game-iv/solution/tiao-yue-you-xi-iv-by-leetcode-solution-zsix/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本文来自博客园,作者:StimuMing,转载请注明原文链接:https://www.cnblogs.com/fole-del/p/15831813.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步