LeetCode系列之【45. 跳躍遊戲 II】C++ 每天一道leetcode!

目錄(快速導航)

題目描述

視頻講解 https://www.bilibili.com/video/av66851964/

思路

代碼


題目描述:

題目鏈接:https://leetcode-cn.com/problems/jump-game-ii/submissions/

給定一個非負整數數組,你最初位於數組的第一個位置。

數組中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達數組的最後一個位置。

示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
     從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。

說明:

假設你總是可以到達數組的最後一個位置。

視頻講解

https://www.bilibili.com/video/av66851964/


思路:

貪心:

從局部最優,達到全局最優。

每一次跳步,選擇利益最大的,也就是跳最遠的。怎麼算最遠,也就是:

注意:

下圖中,每次都需要加上目標跳+可跳:

如:第一次中比較如下: 3+1,1+2,選擇3+1;

第二次比較中:1+1,2+2,4+3,選擇4+3;

切記不要忘記可跳數。


代碼:

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int i = 0,step=0;
        while (i < nums.size()) {
            int max_num = 0,start= i, end= i + nums[i];
            // 避免漏 最後一次跳步
            step++;
            // 調到尾部 跳出
            if (end + 1 >= nums.size()) break;
            // 貪心 每次選擇 目標跳+可跳 最大的
            for (int j = start + 1; j <= end; j++) {
                if (max_num < (nums[j] + j - start)) {
                    i = j;
                    max_num = nums[j] +j - start;
                };
            }
        }
        return step;
    }
};

一起加油!!刷題!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章