@@ -85,69 +85,59 @@ tags:
85
85
``` python
86
86
class Solution :
87
87
def minJumps (self , arr : List[int ]) -> int :
88
- idx = defaultdict(list )
89
- for i, v in enumerate (arr):
90
- idx[v ].append(i)
91
- q = deque([( 0 , 0 ) ])
88
+ g = defaultdict(list )
89
+ for i, x in enumerate (arr):
90
+ g[x ].append(i)
91
+ q = deque([0 ])
92
92
vis = {0 }
93
- while q:
94
- i, step = q.popleft()
95
- if i == len (arr) - 1 :
96
- return step
97
- v = arr[i]
98
- step += 1
99
- for j in idx[v]:
100
- if j not in vis:
101
- vis.add(j)
102
- q.append((j, step))
103
- del idx[v]
104
- if i + 1 < len (arr) and (i + 1 ) not in vis:
105
- vis.add(i + 1 )
106
- q.append((i + 1 , step))
107
- if i - 1 >= 0 and (i - 1 ) not in vis:
108
- vis.add(i - 1 )
109
- q.append((i - 1 , step))
93
+ ans = 0
94
+ while 1 :
95
+ for _ in range (len (q)):
96
+ i = q.popleft()
97
+ if i == len (arr) - 1 :
98
+ return ans
99
+ for j in (i + 1 , i - 1 , * g.pop(arr[i], [])):
100
+ if 0 <= j < len (arr) and j not in vis:
101
+ q.append(j)
102
+ vis.add(j)
103
+ ans += 1
110
104
```
111
105
112
106
#### Java
113
107
114
108
``` java
115
109
class Solution {
116
110
public int minJumps (int [] arr ) {
117
- Map<Integer , List<Integer > > idx = new HashMap<> ();
111
+ Map<Integer , List<Integer > > g = new HashMap<> ();
118
112
int n = arr. length;
119
- for (int i = 0 ; i < n; ++ i ) {
120
- idx . computeIfAbsent(arr[i], k - > new ArrayList<> ()). add(i);
113
+ for (int i = 0 ; i < n; i ++ ) {
114
+ g . computeIfAbsent(arr[i], k - > new ArrayList<> ()). add(i);
121
115
}
122
- Deque<int[]> q = new LinkedList<> ();
123
- Set<Integer > vis = new HashSet<> ();
124
- vis. add(0 );
125
- q. offer(new int [] {0 , 0 });
126
- while (! q. isEmpty()) {
127
- int [] e = q. pollFirst();
128
- int i = e[0 ], step = e[1 ];
129
- if (i == n - 1 ) {
130
- return step;
131
- }
132
- int v = arr[i];
133
- ++ step;
134
- for (int j : idx. getOrDefault(v, new ArrayList<> ())) {
135
- if (! vis. contains(j)) {
136
- vis. add(j);
137
- q. offer(new int [] {j, step});
116
+ boolean [] vis = new boolean [n];
117
+ Deque<Integer > q = new ArrayDeque<> ();
118
+ q. offer(0 );
119
+ vis[0 ] = true ;
120
+ for (int ans = 0 ;; ++ ans) {
121
+ for (int k = q. size(); k > 0 ; -- k) {
122
+ int i = q. poll();
123
+ if (i == n - 1 ) {
124
+ return ans;
125
+ }
126
+ for (int j : g. get(arr[i])) {
127
+ if (! vis[j]) {
128
+ vis[j] = true ;
129
+ q. offer(j);
130
+ }
131
+ }
132
+ g. get(arr[i]). clear();
133
+ for (int j : new int [] {i - 1 , i + 1 }) {
134
+ if (0 <= j && j < n && ! vis[j]) {
135
+ vis[j] = true ;
136
+ q. offer(j);
137
+ }
138
138
}
139
- }
140
- idx. remove(v);
141
- if (i + 1 < n && ! vis. contains(i + 1 )) {
142
- vis. add(i + 1 );
143
- q. offer(new int [] {i + 1 , step});
144
- }
145
- if (i - 1 >= 0 && ! vis. contains(i - 1 )) {
146
- vis. add(i - 1 );
147
- q. offer(new int [] {i - 1 , step});
148
139
}
149
140
}
150
- return - 1 ;
151
141
}
152
142
}
153
143
```
@@ -158,39 +148,36 @@ class Solution {
158
148
class Solution {
159
149
public:
160
150
int minJumps(vector<int >& arr) {
161
- unordered_map<int, vector<int >> idx ;
151
+ unordered_map<int, vector<int >> g ;
162
152
int n = arr.size();
163
- for (int i = 0; i < n; ++i) idx[ arr[ i]] .push_back(i);
164
- queue<pair<int, int>> q;
165
- q.emplace(0, 0);
166
- unordered_set<int > vis;
167
- vis.insert(0);
168
- while (!q.empty()) {
169
- auto e = q.front();
170
- q.pop();
171
- int i = e.first, step = e.second;
172
- if (i == n - 1) return step;
173
- int v = arr[ i] ;
174
- ++step;
175
- if (idx.count(v)) {
176
- for (int j : idx[ v] ) {
177
- if (!vis.count(j)) {
178
- vis.insert(j);
179
- q.emplace(j, step);
153
+ for (int i = 0; i < n; ++i) {
154
+ g[ arr[ i]] .push_back(i);
155
+ }
156
+ vector<bool > vis(n);
157
+ queue<int > q{{0}};
158
+ vis[ 0] = true;
159
+ for (int ans = 0;; ++ans) {
160
+ for (int k = q.size(); k; --k) {
161
+ int i = q.front();
162
+ q.pop();
163
+ if (i == n - 1) {
164
+ return ans;
165
+ }
166
+ for (int j : g[ arr[ i]] ) {
167
+ if (!vis[ j] ) {
168
+ vis[ j] = true;
169
+ q.push(j);
170
+ }
171
+ }
172
+ g[ arr[ i]] .clear();
173
+ for (int j : {i - 1, i + 1}) {
174
+ if (0 <= j && j < n && !vis[ j] ) {
175
+ vis[ j] = true;
176
+ q.push(j);
180
177
}
181
178
}
182
- idx.erase(v);
183
- }
184
- if (i + 1 < n && !vis.count(i + 1)) {
185
- vis.insert(i + 1);
186
- q.emplace(i + 1, step);
187
- }
188
- if (i - 1 >= 0 && !vis.count(i - 1)) {
189
- vis.insert(i - 1);
190
- q.emplace(i - 1, step);
191
179
}
192
180
}
193
- return -1;
194
181
}
195
182
};
196
183
```
@@ -199,38 +186,76 @@ public:
199
186
200
187
```go
201
188
func minJumps(arr []int) int {
202
- idx := map[int][]int{}
203
- for i, v := range arr {
204
- idx[v ] = append(idx[v ], i)
189
+ g := map[int][]int{}
190
+ for i, x := range arr {
191
+ g[x ] = append(g[x ], i)
205
192
}
206
- vis := map[int]bool{0: true}
207
- type pair struct{ idx, step int }
208
- q := []pair{{0, 0}}
209
- for len(q) > 0 {
210
- e := q[0]
211
- q = q[1:]
212
- i, step := e.idx, e.step
213
- if i == len(arr)-1 {
214
- return step
215
- }
216
- step++
217
- for _, j := range idx[arr[i]] {
218
- if !vis[j] {
219
- vis[j] = true
220
- q = append(q, pair{j, step})
193
+ n := len(arr)
194
+ q := []int{0}
195
+ vis := make([]bool, n)
196
+ vis[0] = true
197
+ for ans := 0; ; ans++ {
198
+ for k := len(q); k > 0; k-- {
199
+ i := q[0]
200
+ q = q[1:]
201
+ if i == n-1 {
202
+ return ans
203
+ }
204
+ for _, j := range g[arr[i]] {
205
+ if !vis[j] {
206
+ vis[j] = true
207
+ q = append(q, j)
208
+ }
209
+ }
210
+ g[arr[i]] = nil
211
+ for _, j := range []int{i - 1, i + 1} {
212
+ if 0 <= j && j < n && !vis[j] {
213
+ vis[j] = true
214
+ q = append(q, j)
215
+ }
221
216
}
222
- }
223
- delete(idx, arr[i])
224
- if i+1 < len(arr) && !vis[i+1] {
225
- vis[i+1] = true
226
- q = append(q, pair{i + 1, step})
227
- }
228
- if i-1 >= 0 && !vis[i-1] {
229
- vis[i-1] = true
230
- q = append(q, pair{i - 1, step})
231
217
}
232
218
}
233
- return -1
219
+ }
220
+ ```
221
+
222
+ #### TypeScript
223
+
224
+ ``` ts
225
+ function minJumps(arr : number []): number {
226
+ const g: Map <number , number []> = new Map ();
227
+ const n = arr .length ;
228
+ for (let i = 0 ; i < n ; ++ i ) {
229
+ if (! g .has (arr [i ])) {
230
+ g .set (arr [i ], []);
231
+ }
232
+ g .get (arr [i ])! .push (i );
233
+ }
234
+ let q: number [] = [0 ];
235
+ const vis: boolean [] = Array (n ).fill (false );
236
+ vis [0 ] = true ;
237
+ for (let ans = 0 ; ; ++ ans ) {
238
+ const nq: number [] = [];
239
+ for (const i of q ) {
240
+ if (i === n - 1 ) {
241
+ return ans ;
242
+ }
243
+ for (const j of g .get (arr [i ])! ) {
244
+ if (! vis [j ]) {
245
+ vis [j ] = true ;
246
+ nq .push (j );
247
+ }
248
+ }
249
+ g .get (arr [i ])! .length = 0 ;
250
+ for (const j of [i - 1 , i + 1 ]) {
251
+ if (j >= 0 && j < n && ! vis [j ]) {
252
+ vis [j ] = true ;
253
+ nq .push (j );
254
+ }
255
+ }
256
+ }
257
+ q = nq ;
258
+ }
234
259
}
235
260
```
236
261
0 commit comments