第一眼看过去还以为是dp,然后写了个WA代码
class Solution {
public:
int minJumps(vector<int>& arr) {
unordered_map<int,vector<int>>mp;
for(int i=0;i<arr.size();i++)
mp[arr[i]].push_back(i);
int f[110000];
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=0;i<arr.size();i++)
{
if(i-1>=0)f[i]=min(f[i-1]+1,f[i]);
if(i+1<arr.size())f[i]=min(f[i],f[i+1]+1);
if(mp[arr[i]].size()>1)
{
for(auto t:mp[arr[i]])
{
if(t!=i)f[i]=min(f[i],f[t]+1);
}
}
}
return f[arr.size()-1];
}
};
WA代码看看就好
发现了如果是dp的话没有后效性,所以不是dp。
然后又想了想这题可以用bfs来写
首先将所有元素的下标存在哈希表里,然后bfs即可
const int N=110000;
class Solution {
public:
int minJumps(vector<int>& arr) {
unordered_map<int,vector<int>>mp;//哈希表用于存储相同元素的下标
int dist[N];//最小的操作次数
memset(dist,0x3f,sizeof dist);
dist[0]=0;
for(int i=0;i<arr.size();i++)
mp[arr[i]].push_back(i);//将元素下标放入哈希表里
bool st[N];//判重数组判断当前位置是否走过
queue<int>q;
q.push(0);
memset(st,0,sizeof st);
st[0]=true;
while(q.size())
{
auto t=q.front();
q.pop();
if(t==arr.size()-1)return dist[arr.size()-1];
if(t+1<arr.size()&&!st[t+1]&&dist[t+1]>dist[t]+1)
{
dist[t+1]=dist[t]+1;
q.push(t+1);
st[t+1]=true;
}
if(t-1>=0&&!st[t-1]&&dist[t]+1<dist[t-1])
{
dist[t-1]=dist[t]+1;
q.push(t-1);
st[t-1]=true;
}
if(mp[arr[t]].size()>1)
{
for(auto i:mp[arr[t]])//遍历这个数组中相同元素
{
if(i!=t&&!st[i]&&dist[t]+1<dist[i])
{
dist[i]=dist[t]+1;
q.push(i);
st[i]=true;
}
}
}
}
return dist[arr.size()-1];
}
};
然后会发现被卡,然后对其进行优化,优化思路就是一个元素只入队一次
const int N=110000;
class Solution {
public:
int minJumps(vector<int>& arr) {
unordered_map<int,vector<int>>mp;
unordered_map<int,bool>s2;
int dist[N];
memset(dist,0x3f,sizeof dist);
dist[0]=0;
for(int i=0;i<arr.size();i++)
{
mp[arr[i]].push_back(i);
s2[arr[i]]=false;
}
bool st[N];
queue<int>q;
q.push(0);
memset(st,0,sizeof st);
st[0]=true;
while(q.size())
{
auto t=q.front();
q.pop();
if(t==arr.size()-1)return dist[arr.size()-1];
if(t+1<arr.size()&&!st[t+1]&&dist[t+1]>dist[t]+1)
{
dist[t+1]=dist[t]+1;
q.push(t+1);
st[t+1]=true;
}
if(t-1>=0&&!st[t-1]&&dist[t]+1<dist[t-1])
{
dist[t-1]=dist[t]+1;
q.push(t-1);
st[t-1]=true;
}
if(s2[arr[t]])continue;
if(mp[arr[t]].size()>1)
{
for(auto i:mp[arr[t]])
{
if(s2[arr[t]])continue;
if(i!=t&&!st[i]&&dist[t]+1<dist[i])
{
dist[i]=dist[t]+1;
q.push(i);
st[i]=true;
}
}
}
s2[arr[t]]=true;
}
return dist[arr.size()-1];
}
};