[LeetCode 45] 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.

Example:

Input: [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2.
    Jump 1 step from index 0 to 1, then 3 steps to the last index.

Note:

You can assume that you can always reach the last index.

 

分析

这道题目是hard难度,但其实需要的代码量并不大,但是比较难以想出时间复杂度较低的解法。

初看到这一题,比较简单直观的一种解法是,记录一个与nums等长的数组jump,jump[i]代表到达第i为所需的最小的步数。

我们使用 i 遍历nums数组,每次遍历都要更新jump数组中[i, nums[i] + 1]的最小步数。但是此种解法超时。

思考怎么节约时间复杂度?

对于第 i 步所能到达的最大范围,我们只需要遍历 i-1 步达到的地址范围 [start, end],假设使用index遍历,我们只需要找出nums[index] + index的最大值。

Code

class Solution {
public:
    int jump(vector<int>& nums) {
        vector<int> jump;
        int res = 0;
        int length = nums.size();
        if (length <= 1)
        {
            return res;
        }
        
        int step = 1;
        int maxDis = nums[0];
        int lastStart = 1;
        while (true)
        {
            if (maxDis >= length -1)
                return step;
            
            int tmp = 0;
            for (int i = lastStart; i <= maxDis; i ++)
            {
                if (nums[i] + i > tmp)
                    tmp = nums[i] + i;
            }
            lastStart = maxDis;
            maxDis = tmp;
            step ++;
        }
        return step;
    }
};

运行效率

Runtime: 20 ms, faster than 38.37% of C++ online submissions for Jump Game II.

Memory Usage: 10.1 MB, less than 99.68% of C++ online submissions forJump Game II.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值