鱼C论坛

 找回密码
 立即注册
查看: 2269|回复: 0

[技术交流] LeetCode 1345. 跳跃游戏 IV

[复制链接]
发表于 2020-3-3 16:46:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 798236606 于 2020-3-5 10:12 编辑

传送门:https://leetcode-cn.com/problems/jump-game-iv/

BFS + 哈希表剪枝
  1. class Solution {
  2. public:
  3.     int minJumps(vector<int>& arr) {
  4.         //这一步for循环可以不加,可以规避掉大量连续相同值造成的时间浪费
  5.         for (int i = 1; i < arr.size() - 1; ++i)
  6.         {
  7.             int j  = i + 1;
  8.             
  9.             while (j < arr.size() && arr[j] == arr[i]) ++j;
  10.             arr.erase(arr.begin() + i + 1, arr.begin() + j);
  11.         }

  12.         struct Node{
  13.             int id, step;
  14.         };        

  15.         int n = arr.size();
  16.         unordered_map<int, vector<int>> m;
  17.         
  18.         for (int i = 0; i < n; ++i) m[arr[i]].push_back(i);

  19.         vector<bool> vis(n, false);
  20.         queue<Node> q;
  21.         
  22.         q.push({0, 0});
  23.         vis[0] = true;
  24.         
  25.         while (!q.empty())
  26.         {
  27.             Node now = q.front();
  28.             q.pop();
  29.             
  30.             if (now.id == arr.size() - 1) return now.step;
  31.             
  32.             if (!vis[now.id + 1])
  33.             {
  34.                 q.push({now.id + 1, now.step + 1});
  35.                 vis[now.id + 1] = true;
  36.             }
  37.             
  38.             if (now.id > 0 && !vis[now.id - 1])
  39.             {
  40.                 q.push({now.id - 1, now.step + 1});
  41.                 vis[now.id - 1] = true;
  42.             }

  43.             if (m.find(arr[now.id]) != m.end())
  44.             {
  45.                 for (int i: m[arr[now.id]])
  46.                 {
  47.                     if (!vis[i])
  48.                     {
  49.                         q.push({i, now.step + 1});
  50.                         vis[i] = true;
  51.                     }                    
  52.                 }

  53.                 m.erase(m.find(arr[now.id]));//找到一个相同值,则所有同值的位置都不可再通过同值的规则跳            
  54.             }
  55.         }
  56.         
  57.         return -1;//若未找到路径,返回-1
  58.     }
  59. };
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 04:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表