Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 43863a2

Browse files
feat: add solutions to lc problems: No.1345,1347 (doocs#3463)
* No.1347.Minimum Number of Steps to Make Two Strings Anagram * No.1345.Jump Game IV
1 parent 7379bd4 commit 43863a2

File tree

15 files changed

+513
-382
lines changed

15 files changed

+513
-382
lines changed

‎solution/1300-1399/1345.Jump Game IV/README.md‎

Lines changed: 131 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -85,69 +85,59 @@ tags:
8585
```python
8686
class Solution:
8787
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])
9292
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
110104
```
111105

112106
#### Java
113107

114108
```java
115109
class Solution {
116110
public int minJumps(int[] arr) {
117-
Map<Integer, List<Integer>> idx = new HashMap<>();
111+
Map<Integer, List<Integer>> g = new HashMap<>();
118112
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);
121115
}
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+
}
138138
}
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});
148139
}
149140
}
150-
return -1;
151141
}
152142
}
153143
```
@@ -158,39 +148,36 @@ class Solution {
158148
class Solution {
159149
public:
160150
int minJumps(vector<int>& arr) {
161-
unordered_map<int, vector<int>> idx;
151+
unordered_map<int, vector<int>> g;
162152
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);
180177
}
181178
}
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);
191179
}
192180
}
193-
return -1;
194181
}
195182
};
196183
```
@@ -199,38 +186,76 @@ public:
199186
200187
```go
201188
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)
205192
}
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+
}
221216
}
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})
231217
}
232218
}
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+
}
234259
}
235260
```
236261

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /