【贪心算法】Leetcode 55. 跳跃游戏 45. 跳跃游戏 II
- Leetcode 55. 跳跃游戏
- 解法1 贪心
- Leetcode 45. 跳跃游戏I
- 解法 贪心
Leetcode 55. 跳跃游戏
---------------🎈🎈55. 跳跃游戏 题目链接🎈🎈-------------------
解法1 贪心
关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。
⭐️每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围coverRange。
class Solution {public boolean canJump(int[] nums) {// 遍历数组,nums[i]代表当前可以覆盖到的最大范围coverRange,// 在循环中不断的修改这个coverRange// 之后在这个范围中遍历,最终看能否覆盖到最后一个下标if(nums.length == 1) return true;int coverRange = 0;for(int i = 0; i <= coverRange; i++){coverRange = Math.max(coverRange,nums[i]+i); //动态更新coverRangeif(coverRange >= nums.length-1) return true;}return false;}
}
Leetcode 45. 跳跃游戏I
解法 贪心
为了以最小步数跳跃到最后一节点,意味着:
如果当前的覆盖范围coverrange不包含最后一个节点,那么就遍历到当前覆盖范围的最后一个元素nums[coverrange],期间记录每个节点的覆盖范围nums[i]+i,取最大的存入max
在遍历完当前覆盖范围的最后一个元素后,更新覆盖范围coverrange为max,跳跃次数+1
如果当前覆盖范围包含了最后一个节点,跳跃次数+1,结束
class Solution {public int jump(int[] nums) {if(nums.length == 1) return 0;int coverrange =nums[0];int max = nums[0];int result = 0;for(int i = 0; i<=coverrange;i++){if(coverrange>=nums.length-1){ // 如果覆盖范围coverrange大于了目标,那么代表跳跃次数+1后可以到达,breakresult++;break;}if(nums[i]+i>max){ // 如果当前遍历的nums[i]+i>max,那么就更新目前coverrange中的最大范围maxmax=nums[i]+i;}if(i==coverrange){ // 如果当前遍历到覆盖范围coverrange的最后一个,那么就更新覆盖范围为max,之后跳跃次数+1coverrange=max;result++;}}return result;}
}