【右界覆蓋】45. 跳躍游戲II

給定一個長度為 n 的 0 索引整數(shù)數(shù)組 nums。初始位置為 nums[0]。
每個元素 nums[i] 表示從索引 i 向前跳轉(zhuǎn)的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉(zhuǎn)到任意 nums[i + j] 處:
● 0 <= j <= nums[i]
● i + j < n
返回到達(dá) nums[n - 1] 的最小跳躍次數(shù)step。生成的測試用例可以到達(dá) nums[n - 1]。

解題思路: \color{red}{較難}
本題和55. 跳躍游戲的區(qū)別在于:55只需要判斷是否能到達(dá)最后一個位置,不在意需要跳多少次。
而本題需要跳躍次數(shù)盡可能小,也就是說關(guān)鍵點(diǎn)在于如何定義跳躍一次。

其實(shí)思路和55.差不多,我們?nèi)匀恍枰澬呢澰诒M可能大的右界,只是我們并不是每遍歷一個元素就更新最大右界,因?yàn)槲覀冎辽僖袛嗤辍井?dāng)前這個覆蓋區(qū)間是否能到達(dá)最后一個位置】,如果都不能了,那么說明我們需要繼續(xù)在這個覆蓋區(qū)間遍歷判斷。我們定義【step:到達(dá)遍歷的指針 i 所需要的最少跳躍次數(shù)】。
\color{red}{當(dāng)前 nums[i] 對應(yīng)的右界,對應(yīng)一個覆蓋區(qū)間,從nums[i] 到這個覆蓋區(qū)間就要跳躍一次!}
● 因此跳躍次數(shù)累加應(yīng)該在遍歷指針 i 到達(dá)了本次的最大右界,且仍然不能覆蓋最后一個位置。
累加完成后,更新下一個最大右界(遍歷的過程應(yīng)該記錄)

? 注意細(xì)節(jié):
(1) 初始化。初始化最大右界應(yīng)該為0,step=0,i=0。數(shù)組可能只有一個元素,最開始的元素需判斷: i == nums.length - 1(在判斷覆蓋區(qū)間前,因?yàn)橐坏┻M(jìn)入了覆蓋區(qū)間是否覆蓋了最后一個元素的邏輯,就說明指針 i 要進(jìn)行至少一跳,但有可能本身指針 i 所指向的就是最后一個元素)。
(2) 判斷 i 的右界是否已經(jīng)覆蓋了最后一個位置,如果是,需要返回step + 1( i 要跳躍一次才能到達(dá)覆蓋區(qū)間)。且這個判斷要在【i == 本次最大右界】(說明本次覆蓋區(qū)間不能覆蓋到最后一個位置)之前。

class Solution {
    public int jump(int[] nums) {
        int i = 0; // 當(dāng)前覆蓋區(qū)域中的某一個元素
        int cur_max_index = 0; // 當(dāng)前(不是指i)覆蓋的最大右邊界
        int next_max_index = cur_max_index; // 下一次覆蓋的最大右邊界
        int step = 0;
        while(i < nums.length){
            if(i == nums.length - 1) return step; // 防止1個元素的情況
            int tmp = i + nums[i];
            // if(i == 0) cur_max_index = nums[i];
            if(tmp >= nums.length - 1) return ++step; // 該元素的覆蓋區(qū)域包括了最后一個位置
            if(tmp > next_max_index) next_max_index = tmp; // 更新下一個最大覆蓋右邊界,此時不可能包括最后一個位置
            if(i == cur_max_index){
                step++;
                cur_max_index = next_max_index;
            }
            i++;
        }
        return step;
    }
}

Java-2023

class Solution {
    public int jump(int[] nums) {
        if(nums.length == 1) return 0;
        int hop = 0;
        int cur_max_index = 0;
        int next_max_index = 0;
        for(int i=0; i<nums.length; i++){
            int tmp = nums[i] + i;
            if(tmp >= nums.length-1) break;
            if(tmp > next_max_index) next_max_index = tmp;
            if(i == cur_max_index){ // 當(dāng)前跳數(shù)輪次已經(jīng)查過,都到不了目的地
                cur_max_index = next_max_index;
                next_max_index = 0;
                hop++; // 必須再跳一次
            }
        }
        return hop+1;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 給定一個非負(fù)整數(shù)數(shù)組 nums ,你最初位于數(shù)組的 第一個下標(biāo) 。數(shù)組中的每個元素代表你在該位置可以跳躍的最大長度...
    lxy燊燊閱讀 239評論 0 0
  • 題目 給你一個非負(fù)整數(shù)數(shù)組 nums ,你最初位于數(shù)組的第一個位置。數(shù)組中的每個元素代表你在該位置可以跳躍的最大長...
    草莓桃子酪酪閱讀 573評論 1 0
  • 122. 買賣股票的最佳時機(jī) II[https://leetcode.cn/problems/best-time-...
    哄哄_69b9閱讀 121評論 0 0
  • 輸入: [2,3,1,1,4] 輸出: 2 解釋: 跳到最后一個位置的最小跳躍數(shù)是 2。 從下標(biāo)為 0 跳到下標(biāo)為...
    phper_heart閱讀 184評論 0 0
  • 題目鏈接 難度:困難 類型: 數(shù)組 給定一個非負(fù)整數(shù)數(shù)組,你最初位于數(shù)組的第一個位置。 數(shù)組中...
    wzNote閱讀 4,190評論 0 2

友情鏈接更多精彩內(nèi)容