zoukankan      html  css  js  c++  java
  • [leetcode] Jump Game II

    Given an array of non-negative integers, you are initially positioned at the first index of the array.

    Each element in the array represents your maximum jump length at that position.

    Your goal is to reach the last index in the minimum number of jumps.

    For example:
    Given array A =[2,3,1,1,4]

    The minimum number of jumps to reach the last index is2. (Jump1step from index 0 to 1, then3steps to the last index.)

    https://oj.leetcode.com/problems/jump-game-ii/

    思路1:先想到了DP,从后向前推,当前位置最小步数取决于其所能到达范围内最小的步数,所以需要遍历其覆盖范围,复杂度略高,不是O(n)的算法,目测超时。

    思路2:贪心。维护几个变量,curReach,nextReach,每次在curReach的范围内更新nextReach,直到curReach覆盖到结尾。

    public class Solution {
    	public int jump(int[] A) {
    		if (A == null || A.length < 2)
    			return 0;
    		int n = A.length;
    		int step = 0;
    		int curReach = 0;
    		int nextReach = 0;
    		int i;
    		for (i = 0; i < n;) {
    
    			if (curReach >= n - 1)
    				break;
    
    			while (i <= curReach) {
    				nextReach = nextReach > (i + A[i]) ? nextReach : (i + A[i]);
    				i++;
    			}
    			curReach = nextReach;
    
    			step++;
    		}
    
    		return step;
    	}
    
    	public static void main(String[] args) {
    		System.out.println(new Solution()
    				.jump(new int[] { 2, 3, 1, 1, 1, 2, 3 }));
    	}
    
    }

    第二遍记录:

    每次在curReach内遍历元素,计算下一步可以到达的nextReach,当curReach覆盖n-1时结束。

    public class Solution {
        public int jump(int[] A) {
            int n = A.length;
            int curReach=0;
            int nextReach=0;
            int count=0;
            for(int i=0;i<n;){
                if(curReach>=n-1)
                    return count;
                while(i<=curReach){
                    nextReach=Math.max(nextReach,i+A[i]);
                    i++;
                }
                count++;
                curReach=nextReach;
            }
            return count;
        }
    }

    参考:

    http://www.cnblogs.com/lichen782/p/leetcode_Jump_Game_II.html

    http://blog.csdn.net/havenoidea/article/details/11853301

  • 相关阅读:
    用内联取代宏代码
    参数的缺省值
    令人迷惑的隐藏规则
    重载与覆盖
    重载是如何实现的?
    重载的起源
    C++函数的高级特性
    使用调试器逐步跟踪程序
    new/delete 的使用要点
    malloc/free 的使用要点
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3810757.html
Copyright © 2011-2022 走看看