固执无罪,梦想无价

|

StimuMing

园龄:4年5个月粉丝:0关注:2

2022-01-21 21:16阅读: 37评论: 0推荐: 0

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @   StimuMing  阅读(37)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起