1345. 跳跃游戏 IV bfs
作者:互联网
给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。
每一步,你可以从下标 i 跳到下标:
i + 1 满足:i + 1 < arr.length
i - 1 满足:i - 1 >= 0
j 满足:arr[i] == arr[j] 且 i != j
请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。
注意:任何时候你都不能跳到数组外面。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 。在第一次访问到这个子图中的某个节点时,即会将这个子图的所有其他未在队列中的节点都放入队列。在第二次访问到这个子图中的节点时,就不需要去考虑这个子图中的其他节点了,因为所有其他节点都已经在队列中或者已经被访问过了。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/jump-game-iv/solution/tiao-yue-you-xi-iv-by-leetcode-solution-zsix/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int minJumps(vector<int>& arr) {
int n = arr.size();
vector <bool> vis(n + 1, false);
int ans = 0;
map <int, set<int>> G;
for (int i = 0; i < n; i++) {
G[arr[i]].insert(i);
}
queue <int> q;
q.push(n - 1);
vis[n - 1] = false;
while (!q.empty()) {
int size = q.size();
while (size--) {
int cur = q.front(); q.pop();
if (cur == 0) {
return ans;
}
if (cur + 1 < n && ! vis[cur + 1]) {
q.push(cur + 1);
vis[cur + 1] = true;
}
if (cur - 1 >= 0 && ! vis[cur - 1]) {
q.push(cur - 1);
vis[cur - 1] = true;
}
for (auto x : G[arr[cur]]) {
if (!vis[x]) {
vis[x] = true;
q.push(x);
}
}
G[arr[cur]].clear();
}
ans++;
}
return ans;
}
};
标签:arr,cur,int,子图,1345,IV,bfs,vis,size 来源: https://www.cnblogs.com/xgbt/p/15858295.html