跳跃游戏I
链接:link
解题思路
- 使用贪心算法
- 从数组的第一个元素开始,维护一个变量 m a x P o s i t i o n maxPosition maxPosition,它表示从当前位置开始能够到达的最远位置。
- 然后,我们遍历数组,对于每个位置 i,当做新的起跳点,如果 i 大于等于 m a x P o s i t i o n maxPosition maxPosition,则无法到达该位置,返回 false。否则,我们更新 m a x P o s i t i o n maxPosition maxPosition 为 max( m a x P o s i t i o n maxPosition maxPosition, i + nums[i]),即取当前位置加上当前位置可以跳跃的最大长度和之前能到达的最远位置中的较大值。
- 最后,如果 m a x P o s i t i o n maxPosition maxPosition大于等于数组的长度减一(即最后一个下标的索引),则说明可以到达最后一个下标,返回 true;否则,返回 false。
- 时间复杂度: O ( n ) O(n) O(n),其中 n 是数组长度;空间复杂度: O ( 1 ) O(1) O(1)。
代码
public boolean canJump(int[] nums) {
int maxPosition = 0, i = 0;
while(i <= maxPosition) {
maxPosition = Math.max(i + nums[i], maxPosition);
if(maxPosition >= nums.length - 1) {
return true;
}
i++;
}
return false;
}
跳跃游戏 II
链接:link
解题思路
- 使用贪心算法
- 维护一个变量 m a x P o s i t i o n maxPosition maxPosition,记录在边界范围内,能跳跃的最远位置的下标, m i n S t e p minStep minStep表示需要跳跃的最小次数, b o r d e r border border表示记录当前能跳跃到的位置的边界下标,在此边界内采取跳跃动作时,跳跃次数都得加一,所以统一为到达边界时,更新边界并将跳跃次数增加 1。
- 然后,我们遍历数组,对于每个位置 i,更新 m a x P o s i t i o n maxPosition maxPosition 为 max( m a x P o s i t i o n maxPosition maxPosition, i + nums[i]),即取 当前位置加上当前位置可以跳跃的最大长度 和 之前能到达的最远位置 中的较大值。
- 最后,记录 跳跃次数,如果跳到了终点,即 i < n u m s . l e n g t h − 1 i<nums.length-1 i<nums.length−1(此处不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个位置,否则就无法跳到最后一个位置了)
- 时间复杂度: O ( n ) O(n) O(n),其中 n 是数组长度;空间复杂度: O ( 1 ) O(1) O(1)。
代码
public int jump(int[] nums) {
int maxPosition = 0, minStep = 0, border = 0;
for(int i = 0; i < nums.length - 1; i++) {
maxPosition = Math.max(maxPosition, i + nums[i]);
if(i == border) {
border = maxPosition;
minStep++;
}
}
return minStep;
}