leetcode 45. 跳跃游戏 II
分析:
首先本题要考虑步数在什么时候才要进行加1,当前的最大覆盖范围决定了当前步数能达到的最远位置,而下一个最大覆盖范围(nextLen
)是通过当前范围内所有跳跃选项可以到达的最远位置。如果当前的最大覆盖范围能够覆盖到数组的最后一个元素,那么就可以到达终点;如果不能,每次遍历到当前覆盖范围的末端时,增加步数并将当前覆盖范围更新为下一个最大覆盖范围(curLen = nextLen
),直到覆盖数组的最后一个元素,从而得到最少的步数。
解题步骤:
-
初始化步数
res
为0,curLen
为0,nextLen
为0。 -
遍历数组,每次更新
nextLen
为当前索引加上当前元素值,即nextLen = max(nextLen, nums[i] + i)
。 -
每次遍历到一个元素时,检查是否已经到达当前覆盖范围的末端:
- 如果当前索引
i
达到了curLen
的末端,增加步数res++
,并将curLen
更新为nextLen
。
- 如果当前索引
-
在遍历过程中,如果
nextLen
已经覆盖到或超过了数组的最后一个元素,返回当前步数res
。 -
如果遍历完数组但仍未覆盖到最后一个元素,返回步数
res
。
完整代码:
int jump(vector<int>& nums) {
if (nums.size() == 1) return 0;
int res = 0;
int nextLen = 0;
int curLen = 0;
for (int i = 0; i < nums.size(); ++i) {
nextLen = max(nextLen, nums[i] + i);
if (i == curLen) {
res++;
curLen = nextLen;
if (nextLen >= nums.size() - 1) return res;
}
}
return res;
}