สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มที่เรียกว่า arr เราอยู่ที่ดัชนี 0 ในขั้นตอนเดียว เราสามารถข้ามจากดัชนี i ไปยัง i + x โดยที่:i + x
ดังนั้นหากอินพุตเป็นแบบนั้น

จากนั้นผลลัพธ์จะเป็น 3 เราต้องกระโดดสามครั้งจากดัชนี 0 เป็น 4 เป็น 3 เป็น 9
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งแผนที่ m
-
n :=ขนาดของ arr
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ใส่ i ต่อท้าย m[arr[i]]
-
-
ใส่ i ต่อท้าย m[arr[i]]
-
ใส่ 0 เข้าไป
-
กำหนดหนึ่งคิว q
-
สำหรับการเริ่มต้น lvl :=0 เมื่อไม่มี q ว่าง ให้อัปเดต (เพิ่ม lvl ขึ้น 1), do−
-
sz :=ขนาดของ q
-
ในขณะที่ sz ไม่ใช่ศูนย์ ให้ลด sz ในการวนซ้ำแต่ละครั้ง 1 ทำ −
-
curr :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
ถ้า curr เหมือนกับ n - 1 แล้ว
-
กลับเลเวล
-
-
ผม :=สกุลเงิน
-
ถ้า i - 1>=0 และไม่ใช่ i - 1 อยู่ในการเยี่ยมชมแล้ว −
-
ใส่ i - 1 ลงใน q
-
ใส่ i - 1 เข้าไป
-
-
ถ้า i + 1
-
แทรก i + 1 ลงใน q
-
แทรก i + 1 ลงในการเยี่ยมชม
-
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
ถ้า (m[arr[curr], j]) ไม่ได้เข้าเยี่ยม −
-
แทรก m[arr[curr], j] ลงใน q
-
แทรก m[arr[curr], j] เข้าไป
-
-
-
ถ้า arr[curr] ไม่อยู่ใน m แล้ว −
-
ลบ arr[curr] จาก m
-
-
-
-
กลับ -1
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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));
} อินพุต
{20,-5,-5,25,20,5,5,5,1,25} ผลลัพธ์
3