Skip to content

Latest commit

 

History

History
35 lines (35 loc) · 1.36 KB

45.跳跃游戏 II(困难).md

File metadata and controls

35 lines (35 loc) · 1.36 KB
题目: 从一个非负整数数组的第一个位置开始,数组中的每个元素代表在该位置可以跳跃的最大长度,使用最少的跳跃次数到达数组的最后一个位置;
    输入: [2,3,1,1,4]
    输出: 2
    解释: 跳到最后一个位置的最小跳跃数是2,从下标为0跳到下标为1的位置,跳1步,然后跳3步到达数组的最后一个位置;
说明: 假设总是可以到达数组的最后一个位置
1.正向查找可到达的最大位置(贪心算法)
    [1]思路: 
        (1)在每次跳跃范围之内,比较下次跳跃的最远距离(贪心)
        (2)遍历到了边界后就可确定跳哪个位置,同时可确定下次比较的边界;
    [2]实现:
        public int jump(int[] nums) {
            // 计算数组长度
            int length = nums.length;
            // 定义一个变量用来保存下一步可以跳的最远的位置
            int maxPosition = 0;
            // 定义一个变量用来保存所走的步数
            int step = 0;
            // 定义一个变量用来保存比较的边界
            int end = 0;
            for (int i = 0; i < length - 1; i++) {
                // 在一次可跳跃的范围之内获取下次可跳跃的最远位置
                maxPosition = Math.max(maxPosition, i + nums[i]);
                // 遍历到边界,最远跳跃位置就可确定,同时该最远跳跃位置就成了下次比较的边界
                if(i == end){
                    end = maxPosition;
                    step++;
                }
            }
            return step;
        }
    [3]复杂度分析:
        (1)时间复杂度: O(n),其中 n 是数组长度;
        (2)空间复杂度: O(1)