题目:给一个数组,一个出发的位置start, 一个你想去的位置end, 然后比如a在i位置, 它只能往左蹦到i-a, 往右蹦到i + a位置两种选择, 你的值表示的是你每次必须严格跳的距离。

  • arr数组下标是从0开始的,但是题目给的参数start是从1开始的,所以coding的时候要注意一下

宽度优先遍历

image.png

  • 注意,越界了的要杀死, 出现重复值的要杀死
  • image.png

  • 然后最终找到了的话,层数就是要跳的步数, 因为是宽度优先遍历嘛,所以总能很快找到(前提是存在)

    1. // 宽度优先遍历
    2. public static int jump3(int N, int start, int end, int[] arr) {
    3. if (start < 1 || start > N || end < 1 || end > N) {
    4. return -1;
    5. }
    6. Queue<Integer> queue = new LinkedList<>();
    7. HashMap<Integer, Integer> levelMap = new HashMap<>();
    8. queue.add(start);
    9. levelMap.put(start, 0);
    10. while (!queue.isEmpty()) {
    11. int cur = queue.poll();
    12. int level = levelMap.get(cur);
    13. if (cur == end) {
    14. return level;
    15. } else {
    16. int left = cur - arr[cur - 1];
    17. int right = cur + arr[cur - 1];
    18. if (left > 0 && !levelMap.containsKey(left)) {
    19. queue.add(left);
    20. levelMap.put(left, level + 1);
    21. }
    22. if (right <= N && !levelMap.containsKey(right)) {
    23. queue.add(right);
    24. levelMap.put(right, level + 1);
    25. }
    26. }
    27. }
    28. return -1;
    29. }