Leetcode 55:跳跃游戏(贪心)
1. 题目说明
-
给定一个非负整数数组
nums,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
2. 解答分析
- 分析:
-
- 本题的关键是对于每一步的把控,例如当处于
nums[0]时,此时的值为2,也就是可以跳跃一步或者两步,这样下去对应数组中的每个数字都可以由不同的跳跃方法。 - 但是我们要注意:每个位置跳多少步不是关键,而是最后的跳跃范围是否可以覆盖到最后一个数(也就是终点) 那么我们可以尝试每次移动取最大的跳跃步数(目的是得到最大的范围),依次更新覆盖的范围。
- 本题的贪心算法的关键是:局部最优解,每次取最大的跳跃步数(取最大的覆盖范围);整体最优解: 最后得到整体的最大覆盖范围,看看能否到达最后一个数(终点)
- 本题的关键是对于每一步的把控,例如当处于
-
代码:
-
class Solution{ public boolean canJump(int[] nums){ if(nums.length==1){ return true;//特例:第一个数字自己就是终点 } //开始覆盖范围 int cover=nums[0];//初始值 //在第一个数的覆盖范围内继续不断地更新最大覆盖范围 for(int i=0;i<=cover;i++){ //这里之所以可以取等,因为我们要求的相当于是每个位置的数值,那当然可以取等,如nums[0]==3,那么我们可以跳跃三次到nums[3],再更新最大范围; cover=Math.max(cover,i+nums[i]);//当前的编号,加上可跳跃的数值,即为范围 if(cover>=nums.length-1){//覆盖范围可以到达最后一个数字的下标(终点) return true; } } return false; } }
3. 总结
-
**时间复杂度考虑最坏的情况,如果全部元素都是1,那么循环需要n-1次,时间复杂度为:O(n); **
-
空间复杂度:由于只引入了若干变量,未占用内存存储空间:O(1)
继续努力