今天做到两个题有点意思,贪心问题,没做过就不会的那种题。
一、跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
1、分析
一个题解的想法非常叼,就当作一个人持有能量,需要能量才能走,每到一个新格子都能更新能量。最后看能不能走到终点就行了。
2、代码
class Solution {
public boolean canJump(int[] nums) {
if(nums.length < 2) return true;
int energy = nums[0], i = 1;
while(i < nums.length && energy > 0){
energy--;
energy = Math.max(energy,nums[i]);
i++;
}
return i == nums.length;
}
}
二、跳跃游戏Ⅱ
给你一个非负整数数组 nums
,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
1、分析
持有一个能走到最远的距离,每次都更新这个值。当走到最远边界时,就需要增加一跳了。
2、代码
public int jump(int[] nums) {
if(nums == null || nums.length <= 1) return 0;
int bound = 0;
int maxPosition = 0;
int count = 0;
for(int i = 0; i < nums.length - 1; i++){
//能到达的最远位置
maxPosition = Math.max(maxPosition,nums[i] + i);
//走到边界了
if(i == bound){
bound = maxPosition;
count++;
}
}
return count;
}