【贪心算法】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); //动态更新coverRange
if(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后可以到达,break
result++;
break;
}
if(nums[i]+i>max){ // 如果当前遍历的nums[i]+i>max,那么就更新目前coverrange中的最大范围max
max=nums[i]+i;
}
if(i==coverrange){ // 如果当前遍历到覆盖范围coverrange的最后一个,那么就更新覆盖范围为max,之后跳跃次数+1
coverrange=max;
result++;
}
}
return result;
}
}