赞
踩
通过使用局部解来找到全局最优解,不同题型采用不同的贪心策略。
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
返回到达 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
从正向查找
下标为0出发,可以跳到下标1或者2,可以看出,下标1跳得更远,所以选择下标1
下标1出发,可以选择下标2,下标3,下标4,很明显下标4可以跳得更远。
所以最终步数为2
public int jump(int []arr){ int end = 0; int position = 0; int step = 0; for(int i=0;i< arr.length-1;i++){ //记录能够跳到最远位置 position = Math.max(position, i+arr[i]); //限制在每次跳最远的区间范围计算 //当i到达边界 if(i==end){ //重新记录能够跳到最远处为新的区间边界 end=position; //步数加1 step++; } } //返回步数 return step; }
在遍历数组的时候,不访问最后一个元素,因为边界值一定是大于或者等于最后一个元素的位置。如果访问了最后一个元素,那么存在一种可能就是刚好跳到最后一个元素的位置,代码中会增加一次没必要的次数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。