这道题刷代码随想录的时候也刷过,本来以为有了上一题55.跳跃游戏的基础,这道题会好做一点,但是依旧想不出来思路,回去看了下自己当时写的博客,没想到今天的感受和当时的感受都一模一样。。。What can I say?看了下代码随想录的视频和灵神的题解,终于把这个问题彻底弄清楚了。
由于这道题保证一定能跳到终点,所以我们只需要考虑如何花最少的次数跳到终点,这里我们定义result
,current
和next
三个变量,result
用于记录最小跳跃次数,current
代表本次跳跃后所能达到的覆盖范围的最远边界,next
代表下一次跳跃所能达到的最远覆盖范围,然后用一个for
循环来遍历nums
的元素,当我们遍历到current
处,则说明我们已经达到了当前覆盖范围的边界,我们需要先判断是否已经到达数组的边界,如果还没到达,则当前是已经到达覆盖范围边界但是尚未达到数组的边界。我们必须跳跃一次,并将current
移动到下一次跳跃后的覆盖范围的边界,即current = next;
,result++;
;当进入下一轮for
循环时,则i
进入下次跳跃的覆盖范围,我们再不断地更新下下次跳跃的最远覆盖范围,即next = max(next, i + nums[i]);
。如果i
已经到达了数组边界,则无需进行下一次跳跃,直接退出循环即可。
class Solution {
public:int jump(vector<int>& nums) {int current = 0; //记录当前所在的位置int result = 0; //记录最小次数int next = 0;for(int i = 0; i < nums.size(); i++){next = max(next, i + nums[i]); //更新最大覆盖范围if(i == current){ //已经到达覆盖范围边界,需要进行一次跳跃,直接跳到下一个最大覆盖范围的边界if(i != nums.size() - 1){ //已经到达覆盖范围边界但是尚未达到数组的边界result++;current = next;}}}return result;}
};