携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情
跳跃游戏
55. 跳跃游戏 - 力扣(LeetCode) (leetcode-cn.com)
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
- 1 <= nums.length <= 3 * 10^4
- 0 <= nums[i] <= 10^5
解题思路
- 直有走到0处才会出现走不下去的情况,那就把所有的0理解为陷阱 需要跳过这个陷阱
- 提取所有陷阱的位置,以便循环
- 循环是判断这个陷阱之前的步数是否可以跨过,并且是否可以跨到最后,满足标记一下
- 最后和陷阱的总数比较,相同即为全部陷阱都可以跨过 此路通
代码实现
class Solution {
public boolean canJump(int[] nums) {
int len = nums.length;
ArrayList<Integer> arrayList1 = new ArrayList<Integer>();
for (int i = 0; i < len; i++) {
if (nums[i] == 0) {
arrayList1.add(i);
}
}
if (arrayList1.size() == 0||len==1) {
return true;
}
ArrayList<Integer> arrayList2 = new ArrayList<Integer>();
for (Integer index : arrayList1) {
for (Integer i = 0; i < index; i++) {
if (nums[i]>index-i||nums[i]>=len-i-1) {
arrayList2.add(index);
break;
}
}
}
return arrayList1.size()==arrayList2.size();
}
}
参考
跳跃游戏,数量,最值和是否问题使用动态规划,贪心或许也可以 - 跳跃游戏 - 力扣(LeetCode)
一开始使用dp数组为能否到达最后一个位置,发现做的时间复杂度是on2,后面参考贪心算法后,更改dp数组的含义为最原位置。 - 跳跃游戏 - 力扣(LeetCode)