当前位置: 首页 > ds >正文

LeetCode 1345 跳跃游戏 IV

LeetCode 1345 跳跃游戏 IV 问题解析

问题概述

LeetCode 1345 是一个关于数组跳跃的图论问题,要求从数组第一个元素跳到最后一个元素,每次跳跃可以:

  • 向左或向右跳任意步
  • 跳到与当前元素值相同的任意位置
    目标是求最少跳跃次数。

解题思路

这道题适合用广度优先搜索 (BFS) 解决,核心思路如下:
首先用哈希表记录每个值对应的所有位置
从起点开始 BFS,记录已访问位置避免重复
每次跳跃时,有三种选择:

  • 跳到相同值的所有位置
  • 跳到左边相邻位置
  • 跳到右边相邻位置
    找到终点时返回跳跃次数下面是基于上述思路的C++代码实现:
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;int minJumps(vector<int>& arr) {int n = arr.size();if (n <= 1) return 0;// 预处理相同值的下标集合unordered_map<int, vector<int>> idxSameValue;for (int i = 0; i < n; i++) {idxSameValue[arr[i]].push_back(i);}vector<bool> visited(n, false);queue<int> q;q.push(0);visited[0] = true;int steps = 0;while (!q.empty()) {int size = q.size();// 处理当前层的所有节点for (int i = 0; i < size; i++) {int current = q.front();q.pop();// 到达终点if (current == n - 1) return steps;// 处理相邻节点if (current - 1 >= 0 && !visited[current - 1]) {visited[current - 1] = true;q.push(current - 1);}if (current + 1 < n && !visited[current + 1]) {visited[current + 1] = true;q.push(current + 1);}// 处理相同值的节点int value = arr[current];auto it = idxSameValue.find(value);if (it != idxSameValue.end()) {for (int idx : it->second) {if (!visited[idx]) {visited[idx] = true;q.push(idx);}}// 关键优化:处理完后删除该值的映射idxSameValue.erase(it);}}steps++;}return -1; // 题目保证有解,理论上不会执行到这里
}

代码解释:

  1. 预处理阶段

    • 使用unordered_map<int, vector<int>>存储每个值对应的所有下标
  2. BFS初始化

    • 初始化访问标记数组visited
    • 队列q初始加入起点0
    • 步数计数器steps初始化为0
  3. BFS主循环

    • 按层遍历队列中的节点
    • 处理当前节点的相邻节点(前一个和后一个位置)
    • 处理当前节点值对应的所有下标:
      • 将未访问的下标加入队列并标记为已访问
      • 处理完后从哈希表中删除该值的映射,避免重复处理
  4. 终止条件

    • 当到达终点时直接返回当前步数

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

这个实现通过哈希表快速定位相同值的元素,并在首次访问后立即移除该值的映射,确保每个值的子图只被处理一次,从而高效解决问题。

http://www.xdnf.cn/news/8975.html

相关文章:

  • CentOS7更新 GLIBC 2.25
  • 基于亚博K210开发板——六轴姿态传感器水平测试板验证
  • Java集合使用中的常见错误与最佳实践
  • Oracle 如何实现AI自然语言查询
  • MySQL索引深度解析:从原理到实践
  • STM32的内部FLASH
  • JVM相关
  • 【MPC控制 - 从ACC到自动驾驶】4 MPC的“实战演练”:ACC Simulink仿真与结果深度解读
  • 【Linux】磁盘空间不足
  • vite+vue2安装步骤
  • 使用大模型预测亚急性脊髓联合变性(SCD)的技术方案大纲
  • x星球请求返回值加密
  • 《计算机组成原理》——第二章-10 现代计算机的总线结构
  • 大模型记忆法
  • 嵌入式Linux:子进程执行新程序
  • 智慧校园管理系统
  • openwrt虚拟机安装调试
  • 深入解析Java组合模式:构建灵活树形结构的艺术
  • python小知识 查看项目所有的依赖包
  • 强化学习的前世今生(二)
  • JWT令牌详解及Java中的使用实战
  • 2025郑州台球展/台球厅地毯展/台球灯展/河南台球器材展
  • 字节跳动2025年校招笔试手撕真题教程(一)
  • 第八课 SPSS 在医学影像分析中的基本应用场景
  • Leetcode 587. 安装栅栏
  • 「OC」源码学习——关联属性再探索
  • 代码随想录---贪心篇
  • CS学习网站-geeksforgeeks介绍
  • (1-6-1)Java 集合
  • JavaWeb:SpringBoot工作原理详解