题目:
思路:
代码如下:
using PII = pair<int,int>;
class Solution {
public:
// 思路:边权为1的无向图求起点到终点的最短路问题,使用bfs搜索即可
int minJumps(vector<int>& nums) {
// 1. 完成初始化工作:record记录相同的值所有下标集合;visited用来标记顶点的下标是否访问过
unordered_map<int,vector<int>> record;
unordered_set<int> visited;
int n=nums.size();
for(int i=0;i<n;++i){
record[nums[i]].push_back(i);
}
// 2. 开始bfs以及bfs的初始化工作:q用来存放<顶点下标,步数>
queue<PII> q;
q.push({0,0});
visited.insert(0);
while(q.size()){
auto [idx,step]=q.front();q.pop();
// 到达终点,返回步数
if(idx==n-1)return step;
int val=nums[idx];
// 避免相同值构成的稠密图多次访问造成超时现象,则第一次访问相同值的顶点时,则把它的所有邻接点加入队列
if(record.count(val)){
for(int i:record[val]){
// 若下标i未被访问,则加入队列,并打标记
if(!visited.count(i)){
q.push({i,step+1});
visited.insert(i);
}
}
// 避免再次访问这个稠密图的其他顶点,直接把该顶点构成的子图删掉
record.erase(val);
}
// 扩展idx-1,idx+1这两个邻接点
if(idx-1>=0&&!visited.count(idx-1)){
q.push({idx-1,step+1});
visited.insert(idx-1);
}
if(idx+1<n&&!visited.count(idx+1)){
q.push({idx+1,step+1});
visited.insert(idx+1);
}
}
return 0;
}
};