golang力扣leetcode 1345.跳跃游戏IV

简介: golang力扣leetcode 1345.跳跃游戏IV

1345.跳跃游戏IV

1345.跳跃游戏IV

题解

i + 1 满足:i + 1 < arr.length

i - 1 满足:i - 1 >= 0

j 满足:arr[i] == arr[j] 且 i != j


问从第一个出发到达最后一个需要几步,其实就是一个无向图,那么对于需要最短路径的问题,直接BFS就能做出来,每个元素连着 <i -1> <i+1><value相同>的这些边,那么对于这个图来说,可能出现无限循环的情况,用一个visited的map来处理

代码

package main
type P struct {
  idx, step int
}
func minJumps(arr []int) int {
  queue := make([]P, 0)
  visited := make(map[int]bool)
  repeat := make(map[int][]int)
  for k, v := range arr {
    repeat[v] = append(repeat[v], k) //把值相同的下标存起来
  }
  queue = append(queue, P{0, 0})
  visited[0] = true
  for {
    top := queue[0]
    queue = queue[1:]
    idx, step := top.idx, top.step
    if idx == len(arr)-1 {
      return step
    }
    //值相同
    for _, v := range repeat[arr[idx]] {
      if !visited[v] {
        queue = append(queue, P{
          idx:  v,
          step: step + 1,
        })
      }
      visited[v] = true
    }
    //i-1
    if idx-1 >= 0 {
      if !visited[idx-1] {
        queue = append(queue, P{
          idx:  idx - 1,
          step: step + 1,
        })
      }
      visited[idx-1] = true
    }
    //i+1
    if idx+1 <= len(arr)-1 {
      if !visited[idx+1] {
        queue = append(queue, P{
          idx:  idx + 1,
          step: step + 1,
        })
      }
      visited[idx+1] = true
    }
    //BFS三种情况遍历完了,把当前这个值删除
    delete(repeat, arr[idx])
  }
}


目录
相关文章
|
6月前
|
算法 Go 索引
【LeetCode 热题100】45:跳跃游戏 II(详细解析)(Go语言版)
本文详细解析了力扣第45题“跳跃游戏II”的三种解法:贪心算法、动态规划和反向贪心。贪心算法通过选择每一步能跳到的最远位置,实现O(n)时间复杂度与O(1)空间复杂度,是面试首选;动态规划以自底向上的方式构建状态转移方程,适合初学者理解但效率较低;反向贪心从终点逆向寻找最优跳点,逻辑清晰但性能欠佳。文章对比了各方法的优劣,并提供了Go语言代码实现,助你掌握最小跳跃次数问题的核心技巧。
244 15
|
算法
Leetcode第45题(跳跃游戏II)
这篇博客文章讨论了如何使用贪心算法解决LeetCode第45题“跳跃游戏II”,目的是找到使用最少跳跃次数到达数组末尾的策略。
234 8
Leetcode第45题(跳跃游戏II)
|
6月前
|
算法 Go
【LeetCode 热题100】55:跳跃游戏(详细解析)(Go语言版)
本篇解析详细讲解了 LeetCode 热题 55——跳跃游戏(Jump Game)。通过判断是否能从数组起点跳至终点,介绍了两种高效解法:贪心算法和反向思维。贪心法通过维护最远可达位置 `maxReach` 实现一次遍历,时间复杂度 O(n),空间复杂度 O(1);反向法则从终点回溯,判断是否可到达起点。两者均简洁高效,适合面试使用。延伸题目如 LeetCode 45 进一步提升挑战。
192 7
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
247 0
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
86 0
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
155 0
Leetcode第55题(跳跃游戏)
LeetCode第55题“跳跃游戏”要求判断在一个非负整数数组中,从第一个位置出发,是否能够到达最后一个位置,其中每个位置的元素代表可跳跃的最大长度。
86 0
|
算法
leetcode188 买卖股票的最佳时机IV
leetcode188 买卖股票的最佳时机IV
139 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
209 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
322 2

热门文章

最新文章

推荐镜像

更多