Jump Game II

来源:互联网 发布:数据库实例是什么 编辑:程序博客网 时间:2024/06/04 23:28

来源于九章题解,这是一个伪贪心算法,因为看的其他dp解法,现在leetcode已无法通过,遂只写伪贪心。

不同于dp用数组来存每个位置的最小步数,伪贪心是直接遍历循环,每一个大循环,即为一步,最小步数,一定可以保证,最早跳出,即jumps一定是最小的。

如何做到呢?

因为最大的步数可能出现在一个次大的步数之后,如:1,4,1,2,10,1,1,1,2,1,1,1

那么就需要在大的循环之后构造一个新的区域,即在次大步数的可达范围内,是否还存在一个更大的步数到一个更大范围,如上,在A[1] = 4到A[5]范围内,还存在一个A[4] = 10的更大步数可以到达一个更大范围。

这个新的区域由每次所找到的最大步数可达的最大范围来界定。

public int jump(int[] A) {

       if (A == null || A.length == 0) {
           return 0;
       } 
       int start = 0, end = 0;
       int jumps = 0;
       while (end < A.length - 1) {

           jumps++;

   // 上一次的结束位置是最大范围

           int maxIndex = end;

           for (int i = start; i <= end; i++) {

// 看在当前范围内,是否存在一个更大的步数到一个更大范围

               if (A[i] + i >= maxIndex) {
                   maxIndex = A[i] + i;
               }

           }

   // 已经对上一次的范围进行了全搜索,找到了当中的可能最大步数,所以开始位置可以是范围+1,

           start = end + 1;

   // 这是最大可达的范围,即为下一次搜索截止,看看当中是否还存在一个更大的可达范围

           end = maxIndex;
       }
       return jumps;
    }
0 0
原创粉丝点击