题目
55. 跳跃游戏
思路
一看跳跃,自然想到动态规划。去看了题解发现可以将该问题进行转化,记录每个下标能达到的最远距离,要是这个最远距离超过了数组长度则说明能够到达终点。真的很巧妙!但是最开始自己写,想的是用一个队列来装可到达的下标,有点麻烦,发现是因为循环的边界设置出了问题,当循环条件应该时i<=max 而不是i < len!
代码
public boolean canJump(int[] nums) {// 记录所有节点跳跃能到达最远的地方int len = nums.length;if(len == 1){// 只有一个元素 最开始就可以到达终点return true;}int max = 0;for (int i = 0; i <= max; i++) {// 注意循环终止条件是<= maxmax = Math.max(max, nums[i] + i);if(max >= len - 1){return true;}}return false;}
题目
45. 跳跃游戏 II
思路
看了卡尔的视频,思想就是:每次都尽可能走最远,当覆盖范围大于数组时就停止计数。这里每次走最远,需要去遍历当前覆盖范围内的下标,选出能够跳得最远的下标,作为下一次跳的起点。
代码
public int canJump2(int[] nums) {// 记录所有节点跳跃能到达最远的地方int len = nums.length;if(len == 1){return 0;}int max = 0;int step = 0;int i = 0;while (max <= len - 1){step ++;// 最大的覆盖范围max = Math.max(max, i + nums[i]);if(max >= len - 1){return step;}i = getMaxNums(i, max, nums);}return step;}private int getMaxNums(int start, int end, int[] nums){// 找到覆盖范围内能够跳到最远的下标int max = 0;int maxIndex = 0;for (int i = start; i <= end; i++) {int temp = i + nums[i];if(temp > max){maxIndex = i;max = temp;}}return maxIndex;}