題目描述:給定一個非負整數數組 nums ,你最初位於數組的 第一個下標 。java
數組中的每一個元素表明你在該位置能夠跳躍的最大長度。segmentfault
判斷你是否可以到達最後一個下標。數組
示例說明請見LeetCode官網。網絡
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/probl...
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。url
- 首先,若是nums的長度爲1,則直接返回true;
- 若是nums的第一個元素的值是0,因爲不可能日後跳躍,因此直接返回false;
當不是前兩種狀況時,首先,聲明一個變量length爲數組最大的索引位,聲明一個HashSet爲jumped記錄跳躍過的位置,聲明一個隊列toJump記錄當前走到的位置,首先,將索引位0加入到jumped和toJump,而後遍歷隊列toJump按照如下過程處理:code
- 從隊列中取出一位cur,並將之加入到jumped中;
- 若是cur對應的數組的值爲0,則跳過處理下一個隊列中的值;
- 若是cur對應的數組的值大於等於
lengt-cur
便可以從當前位置直接跳躍到最後一位,則直接返回true;- 不然,將cur以後
nums[cur]
位的索引位加入到toJump,加入前須要判斷是否在jumped和toJump已經存在,若是存在,避免重複處理,跳過,而後處理下一個隊列中的值。最後,若是隊列爲空了尚未跳到數組的最後一位,則返回false。索引
import java.util.HashSet; import java.util.LinkedList; import java.util.Queue; import java.util.Set; public class LeetCode_055 { public static boolean canJump(int[] nums) { if (nums.length == 1) { return true; } if (nums[0] == 0) { return false; } int length = nums.length - 1; // 定義走到過的位置 Set<Integer> jumped = new HashSet<>(); jumped.add(0); // 定義當前到的位置 Queue<Integer> toJump = new LinkedList<>(); toJump.add(0); while (!toJump.isEmpty()) { Integer cur = toJump.poll(); jumped.add(cur); if (nums[cur] == 0) { continue; } if (nums[cur] >= length - cur) { return true; } else { for (int i = nums[cur]; i >= 1; i--) { if (!jumped.contains(cur + i) && !toJump.contains(cur + i)) { toJump.add(cur + i); } } } } return false; } public static void main(String[] args) { int[] nums = new int[]{2, 3, 1, 1, 4}; System.out.println(canJump(nums)); } }
【每日寄語】 好的運氣從清晨開始,願你晨起有微笑,笑裏有幸福。