跳跃数组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]; } };
这是很容易想到的处理算法,但是不够好,复杂为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】

浙公网安备 33010602011771号