贪心算法:每次取局部最优解
解法1:从左向右逼近终点
一个记录当前位置,一个记录最远跳跃位置,一个记录跳跃次数,遍历数组(不需要遍历到最后一位,如果遍历到最后一位,那么正好跳到最后一位的时候就会多加一次跳跃次数),每当当前位置和索引i相等时(即当前位置最后一种跳法跳完时),将最远跳跃位置赋值给当前位置,跳跃次数加1;如果在索引中没找到当前位置,就说明已经跳出去了
1.然后从第一格到最后面n-1依次进行遍历,每经过之处都要求出最大可达到的位置maxStep;
2.如果index位置大于等于长度n,则表示已经跳出了;
3.如果index位置等于i,表示遍历到了最后一步跳法跳完时候,此时index需要更改一下为最远可以达到的位置,同时count需要进行加1,求出局部的最优
public int Jump (int n, int[] A) { // write code here int count=0;//跳的步数 int index=0;//当前位置 int maxStep=0;//最远可跳跃位置 for(int i=0;i<n-1;i++){ maxStep=Math.max(maxStep,i+A[i]);//maxStep记录的每次可以达到的最大位置 if(index>=n){ break;//当前位置大于长度,表示已经跳完了,出去了 } if(index==i){//当前位置等于i时候,表示遍历到了最后一步跳法跳完时候 index=maxStep;//根据每处的maxStep,将当前位置换成局部最优的 count++;//当前位置完成一步跳跃之后,等于最远可到达位置,步数加1 } } return count; }
解法2:从右向左逼近起点
思路: 先确定终点位置, 从左至右找到第一个能到达终点(会不断更新)的位置, 以此类推, 逼近起点
public int Jump (int n, int[] A) { // write code here int result = 0; // 初始化终点 int reach = A.length - 1; // 逆推是否到达了起点 while (reach != 0) { for (int i = 0; i < reach; i++) { // 从左(i递增)至右查找到第一个(离终点最远, 贪就贪在这里)能跳至终点的落脚处 if (i + A[i] >= reach) { // 更新终点 reach = i; result++; } } } return result; }