Skip to content

Commit 43863a2

Browse files
authored
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

+131-106
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)