Given an array of integers arr
, you are initially positioned at the first index of the array.
In one step you can jump from index i
to index:
i + 1
where:i + 1 < arr.length
.i - 1
where:i - 1 >= 0
.j
where:arr[i] == arr[j]
andi != j
.
Return the minimum number of steps to reach the last index of the array.
Notice that you can not jump outside of the array at any time
Example 1:
Input: arr = [100,-23,-23,404,100,23,23,23,3,404] Output: 3 Explanation: You need three jumps from index 0 --> 4 --> 3 --> 9. Note that index 9 is the last index of the array.
Example 2:
Input: arr = [7] Output: 0 Explanation: Start index is the last index. You don't need to jump.
Example 3:
Input: arr = [7,6,9,6,9,6,9,7] Output: 1 Explanation: You can jump directly from index 0 to index 7 which is last index of the array.
Example 4:
Input: arr = [6,1,9] Output: 2
Example 5:
Input: arr = [11,22,7,7,7,7,7,7,7,22,13] Output: 3
Constraints:
1 <= arr.length <= 5 * 10^4
-10^8 <= arr[i] <= 10^8
利用BFS,广度优先是可以数步数的,每遍历一层步数加1,直到满足条件返回。
上一题当d值比较大时,广度优先每个index,[index - d,index + d]都要遍历,广度上情况比较多,采用DFS + DP比较合适
class Solution {
public:
int minJumps(vector<int>& arr) {
unordered_map<int,vector<int> > indexOfValue;
int n = arr.size();
for(int i = 0; i < n; i++)
{
indexOfValue[arr[i]].push_back(i);
}
queue<int> Q;
vector<bool> visited(n,false);
Q.push(0);
visited[0] = true;
int step = 0;
while(!Q.empty())
{
for(int i = Q.size() - 1; i >= 0; i--)
{
int idx = Q.front();
Q.pop();
if(idx == n - 1)
return step;
vector<int> &next = indexOfValue[arr[idx]];
next.push_back(idx + 1);
next.push_back(idx - 1);
for(int k : next)
{
if( k >= 0 && k < n && !visited[k])
{
visited[k] = true;
Q.push(k);
}
}
next.clear();
}
step++;
}
return 0;
}
};