Leetcode-1345

Jump Game IV

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>

const int INF = 0x3fff'ffff;

class Solution {
public:
    int minJumps(std::vector<int>& arr) {
        int n = arr.size();
        std::unordered_map<int, std::vector<int>> edges;
        for (int i = 0; i < n; ++i) {
            edges[arr[i]].push_back(i);
        }
        
        std::vector<int> dist(n, INF);
        std::queue<int> q;
        dist[0] = 0;
        q.push(0);
        while (!q.empty()) {
            int u = q.front();
            int d = dist[u];
            q.pop();
            if (u > 0 && dist[u] + 1 < dist[u - 1]) {
                dist[u - 1] = dist[u] + 1;
                q.push(u - 1);
            }
            if (u < n - 1 && dist[u] + 1 < dist[u + 1]) {
                dist[u + 1] = dist[u] + 1;
                q.push(u + 1);
            }
            auto it = edges.find(arr[u]);
            if (it == edges.end()) {
                continue;
            }
            const vector<int>& next_indices = it->second;
            for (auto& v : next_indices) {
                if (INF == dist[v]) {
                    dist[v] = dist[u] + 1;
                    q.push(v);
                }
            }
            edges.erase(it);
        }
        return dist.back();
    }
};

Leetcode-1345