Jump Game IV

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] and i != 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的題,唯一注意的是:如果left, current, right 都是同一個數,那麼HashMap<Integer, List<Integer>> 又要重新訪問一遍,那麼解決辦法就是訪問過當前node的所有index之後,立刻清零;這樣每個index只訪問一遍;O(N)

class Solution {
    public int minJumps(int[] arr) {
        HashMap<Integer, List<Integer>> hashmap = new HashMap<>();
        int n = arr.length;
        for(int i = 0; i < n; i++) {
            hashmap.putIfAbsent(arr[i], new ArrayList<Integer>());
            hashmap.get(arr[i]).add(i);
        }
        
        Queue<Integer> queue = new LinkedList<Integer>();
        boolean[] visited = new boolean[n];
        queue.offer(0);
        visited[0] = true;
        
        int step = 0;
        while(!queue.isEmpty()) {
            int size = queue.size();
            for(int i = 0; i < size; i++) {
                Integer index = queue.poll();
                if(index == n - 1) {
                    return step;
                }
                // current index;
                for(Integer curindex : hashmap.get(arr[index])) {
                    if(curindex != index && !visited[curindex]) {
                        queue.offer(curindex);
                        visited[curindex] = true;
                    }
                }
                // left;
                if(index - 1 >= 0 && !visited[index - 1])  {
                    queue.offer(index - 1);
                    visited[index - 1] = true;
                }
                // right;
                if(index + 1 < n && !visited[index + 1]) {
                    queue.offer(index + 1);
                    visited[index + 1] = true;
                }
                hashmap.get(arr[index]).clear();
            }
            step++;
        }
        return -1;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章