1345. Jump Game IV
给一个整数阵列 arr,现在一开始在第一个位置,
每一步都能:
1. 往后一格移动(如果可以)
2. 往前一格移动(如果可以)
3. 往数字一样的格子移动, i.e. arr[i] == arr[j] (从 i 移动到 j)
求最少需要几步才能走到最后一个位置。
Example 1:
Input: arr = [100,-23,-23,484,100,23,23,23,3,484]
Output: 3
Explanation:
0->4->3->9 (100走到100,往回走一格,484走到484到最后一格)
Example 2:
Input: arr = [7]
Output: 0
Explanation:
一开始就在最后一格,不需要移动
Example 3:
Input: arr = [7,6,9,6,9,6,9,7]
Output: 1
Explanation:
0->7 (7移动到7)
解题思路:
建边做 BFS,就能计算出开头到最后所需的最短步数。
建边的方法,按照规则1、2的不需要特别处理,BFS pop 出来的时候直接检查就行,
按照规则3的不能枚举建边会变成 O(n^2),我们可以改用一个 map 来记录,
每个 key 对应到一个阵列,阵列里面存了那些值跟 key 相同的 index,
这样我们 BFS pop 出来时就直接找这个阵列然后每个都走过,
之后要把这个阵列清空,避免其他点又重新看过这个阵列,否则又会变 O(n^2)。
C++ code:
class Solution {
public:
int minJumps(vector<int>& arr) {
map<int, vector<int>> mp;
for(int i = arr.size() - 1; i >= 0; i