跳跃数组II

原题在这里

  基于能否到达的基础上,增加了最少次数的条件,且保证一定能够到达。

analyse:

   mine——定义dp[i]表示到达下标i最少需要次数

   那么,初始化有int_max(or 数组长度+1),dp[0]=0

   状态转移:

     将dp在num[i]范围j取min值(dp[i]+1,dp[i+j])

code:

class Solution
{
public:
    int jump(vector<int> &nums)
    {
        int l = nums.size();
        vector<int> dp(l, 1e4 + 1);
        dp[0] = 0;
        for (int i = 0; i < l; ++i)
            for (int j = 1; i + j < l && j <= nums[i]; ++j)
                dp[i + j] = min(dp[i + j], dp[i] + 1);
        return dp[l - 1];
    }
};
easy

这是很容易想到的处理算法,但是不够好,复杂为O(N*num[i])

进阶:

  analyse:

    对于状态num[i],在可达范围内[i,i+num[i]]的step次数一定相同,那么最终在上一个dp的遍历结果呈现阶梯形式

    也就是,只需要维护当前step可以到达的区间范围即可,当到达当前step的max边界时候,step+1,更新max边界

    注意一点是,实际遍历处理不需要遍历到数组最后一个下标

code:

class Solution
{
public:
    int jump(vector<int> &nums)
    {
        int n = nums.size(), ans = 0, x = 0, r = 0;
        for (int i = 0; i < n - 1; ++i)
        {
            x = max(x, i + nums[i]);
            if (i == r)
                r = x, ans++;
        }
        return ans;
    }
};

 

【Over】

posted @ 2022-03-27 11:45  Renhr  阅读(32)  评论(0)    收藏  举报