泰安网站建设入门,二次元WordPress,西安百度seo排名软件,数据网站怎么做的题目一(中等)
给你一个非负整数数组 nums #xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标#xff0c;如果可以#xff0c;返回 true #xff1b;否则#xff0c;返回 false 。
示例 1你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标如果可以返回 true 否则返回 false 。
示例 1 输入nums [2,3,1,1,4] 输出true 解释可以先跳 1 步从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 示例 2 输入nums [3,2,1,0,4] 输出false 解释无论怎样总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 所以永远不可能到达最后一个下标。 提示
1 prices.length 1050 prices[i] 104
题目思路
从终点向前遍历一开始的 target 设置为 n - 1, 遍历指针 i 设置为 n - 2当 i 遍历过起点(index 为 0)后遍历结束。if (i nums[i] target) target i 这个判断的含义是如果从当前位置跳跃最大长度可以到达此时的 target那么我们就把 target 更新为此时的 i (因为如果到达此时的 i , 就可以到达原本的 target如此循环一定可以到达一开始的 target 也就是最后一个下标 n - 1)然后 i-- 向前遍历重复这个过程直到循环结束。 最后判断 if target 0 说明从起始点开始一定有一个策略可以一直跳到最后一个下标返回 true否则说明不存在这样的策略返回 false游戏结束。
答案
class Solution {public boolean canJump(int[] nums) {int target nums.length -1;int i target -1; while(i 0){if(i nums[i] target){target i;}i--;}return target 0 ; }
}题目二(中等)
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说如果你在 nums[i] 处你可以跳转到任意 nums[i j] 处:
0 j nums[i]i j n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
示例 1: 输入: nums [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置跳 1 步然后跳 3 步到达数组的最后一个位置。 示例 2: 输入: nums [2,3,0,1,4] 输出: 2 提示
1 prices.length 1050 prices[i] 104题目保证可以到达 nums[n-1]
题目思路
贪心的思路局部最优当前可移动距离尽可能多走如果还没到终点步数再加一。整体最优一步尽可能多走从而达到最小步数。要从覆盖范围出发不管怎么跳覆盖范围内一定是可以跳到的以最小的步数增加覆盖范围覆盖范围一旦覆盖了终点得到的就是最小步数 答案
class Solution {public int jump(int[] nums) {if (nums null || nums.length 0 || nums.length 1) {return 0;}//记录跳跃的次数int count0;//当前的覆盖最大区域int curDistance 0;//最大的覆盖区域int maxDistance 0;for (int i 0; i nums.length; i) {//在可覆盖区域内更新最大的覆盖区域maxDistance Math.max(maxDistance,inums[i]);//说明当前一步再跳一步就到达了末尾if (maxDistancenums.length-1){count;break;}//走到当前覆盖的最大区域时更新下一步可达的最大区域if (icurDistance){curDistance maxDistance;count;}}return count;}
}