标签:min public 最小 相同 pos 题解 ble leetcode 直接
双周赛最后一题
题意:从起始点开始走,每次只能往前走一步,或者往后走一步,或者直接跳到数值一样的格子。求跳到最后一个格子的最小步数
题解: 一开始以为是动态规划,后来发现用BFS更加简单。动态规划也是可以解的。
struct Node
{
int pos;
int num;
Node(){}
Node(int pos,int num)
{
this->pos = pos;
this->num = num;
}
};
class Solution {
public:
map<int,vector<int>> m;
int vis[50005];
int minJumps(vector<int>& arr) {
for(int i=1;i<arr.size();i++)
{
vis[i]=99999999;
m[arr[i]].push_back(i);
}
queue<Node> q;
int ans=0;
q.push(Node(0,0));
vis[0]=0;
while(!q.empty())
{
Node term = q.front();
q.pop();
if(term.pos==arr.size()-1)
ans = term.num;
//往后走一步
if(term.pos>0)
{
if(vis[term.pos-1]>term.num+1)
{
q.push(Node(term.pos-1,term.num+1));
vis[term.pos-1]=term.num+1;
}
}
//往前走一步
if(vis[term.pos+1]>term.num+1)
{
q.push(Node(term.pos+1,term.num+1));
vis[term.pos+1]=term.num+1;
}
//相同数值的位置
for(int i=0;i<m[arr[term.pos]].size();i++)
{
if(m[arr[term.pos]][i]==term.pos)
continue;
if(vis[m[arr[term.pos]][i]]>=term.num+1)
{
q.push(Node(m[arr[term.pos]][i],term.num+1));
vis[m[arr[term.pos]][i]] = term.num+1;
}
else
break;//防止之后再次循环,超时。
}
}
return ans;
}
};
LeetCode 1345. Jump Game IV(BFS)
标签:min public 最小 相同 pos 题解 ble leetcode 直接
原文地址:https://www.cnblogs.com/dacc123/p/12288316.html