Giả sử chúng ta có một mảng các số nguyên được gọi là arr. Ban đầu chúng ta đang ở chỉ số 0. Trong một bước, chúng ta có thể nhảy từ chỉ số i sang i + x trong đó:i + x
Vì vậy, nếu đầu vào giống như,
thì đầu ra sẽ là 3, Chúng ta cần ba bước nhảy từ chỉ số 0 đến 4 thành 3 đến 9.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một bản đồ m
-
n:=kích thước của arr
-
để khởi tạo i:=0, khi i
-
chèn i vào cuối m [arr [i]]
-
-
chèn i vào cuối m [arr [i]]
-
chèn 0 vào đã truy cập
-
Xác định một hàng đợi q
-
để khởi tạo lvl:=0, khi không phải q trống, hãy cập nhật (tăng lvl lên 1), do−
-
sz:=kích thước của q
-
trong khi sz khác 0, giảm sz trong mỗi lần lặp đi 1 do -
-
curr:=phần tử đầu tiên của q
-
xóa phần tử khỏi q
-
nếu curr giống với n - 1 thì
-
trả về lvl
-
-
i:=curr
-
nếu tôi - 1> =0 và không phải tôi - 1 được truy cập, thì -
-
chèn i - 1 vào q
-
chèn i-1 vào đã truy cập
-
-
nếu tôi + 1
-
chèn i + 1 vào q
-
chèn i + 1 vào đã truy cập
-
-
để khởi tạo j:=0, khi j
-
nếu (m [arr [curr], j]) không được truy cập, thì -
-
chèn m [arr [curr], j] vào q
-
chèn m [arr [curr], j] vào đã truy cập
-
-
-
nếu arr [curr] không phải bằng m, thì -
-
xóa arr [curr] khỏi m
-
-
-
-
trả về -1
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minJumps(vector<int>& arr) {
map<int, vector<int> > m;
int n = arr.size();
for (int i = 0; i < n; i++) {
m[arr[i]].push_back(i);
}
set<int> visited;
visited.insert(0);
queue<int> q;
q.push(0);
for (int lvl = 0; !q.empty(); lvl++) {
int sz = q.size();
while (sz--) {
int curr = q.front();
q.pop();
if (curr == n - 1)
return lvl;
int i = curr;
if (i - 1 >= 0 && !visited.count(i - 1)) {
q.push(i - 1);
visited.insert(i - 1);
}
if (i + 1 < n && !visited.count(i + 1)) {
q.push(i + 1);
visited.insert(i + 1);
}
for (int j = 0; j < m[arr[curr]].size(); j++) {
if (!visited.count(m[arr[curr]][j])) {
q.push(m[arr[curr]][j]);
visited.insert(m[arr[curr]][j]);
}
}
if (m.count(arr[curr])) {
m.erase(arr[curr]);
}
}
}
return -1;
}
};
main(){
Solution ob;
vector<int> v = {20,-5,-5,25,20,5,5,5,1,25};
cout << (ob.minJumps(v));
} Đầu vào
{20,-5,-5,25,20,5,5,5,1,25} Đầu ra
3