贪心算法
通过使用局部解来找到全局最优解,不同题型采用不同的贪心策略。
1.题目
给定一个长度为 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
2.解析:
从正向查找
下标为0出发,可以跳到下标1或者2,可以看出,下标1跳得更远,所以选择下标1
下标1出发,可以选择下标2,下标3,下标4,很明显下标4可以跳得更远。
所以最终步数为2
3.代码
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;
}
在遍历数组的时候,不访问最后一个元素,因为边界值一定是大于或者等于最后一个元素的位置。如果访问了最后一个元素,那么存在一种可能就是刚好跳到最后一个元素的位置,代码中会增加一次没必要的次数。