题目描述:给定一个非负整数数组 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)); } }
【每日寄语】 好的运气从清晨开始,愿你晨起有微笑,笑里有幸福。