LeetCode題解:跳躍游戲II

題目描述

給你一個非負整數(shù)數(shù)組nums,你最初位于數(shù)組的第一個位置。
數(shù)組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數(shù)到達數(shù)組的最后一個位置。
假設(shè)你總是可以到達數(shù)組的最后一個位置。

示例

輸入:nums = [2,3,1,1,4]
輸出:2
解釋:跳到最后一個位置的最小跳躍數(shù)是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然后跳 3 步到達數(shù)組的最后一個位置。

思路方法

這道題是典型的貪心算法,通過局部最優(yōu)解得到全局最優(yōu)解。以下兩種方法都是使用貪心算法實現(xiàn),只是貪心的策略不同。

方法一:反向查找最初位置

我們的目標是到達數(shù)組的最后一個位置,因此我們可以考慮最后一步跳躍前所在的位置,該位置通過跳躍能夠到達最后一個位置。
如果有多個位置通過跳躍都能夠到達最后一個位置,那么我們應(yīng)該如何進行選擇呢?直觀上來看,我們可以使用貪心的選擇距離最后一個位置最遠的那個位置,也就是對應(yīng)下標最小的那個位置。因此我們可以從左到右遍歷數(shù)組,選擇第一個滿足要求的位置。
找到最后一步跳躍前所在的位置之后,以此類推,直到找到數(shù)組的開始的位置。

class Solution {
    public int jump(int[] nums) {
        int position = nums.length - 1;
        int steps = 0;
        while (position > 0) {
            for (int i = 0; i < position; i++) {
                if (i + nums[i] >= position) {
                    position = i;
                    steps++;
                    break;
                }
            }
        }
        return steps;
    }
}

復雜度分析

  • 時間復雜度:O(n^2)
  • 空間復雜度:O(1)

方法二:正向查找到達最大位置

方法一雖然直觀,但是時間復雜度比較高,有沒有辦法降低時間復雜度呢?
如果我們貪心地進行正向查找,每次找到可到達的最遠位置,就可以在線性時間內(nèi)得到最少的跳躍次數(shù)。
例如,對于數(shù)組 [2,3,1,2,4,2,3],初始位置是下標 0,從下標 0 出發(fā),最遠可到達下標 2。下標 0 可到達的位置中,下標 1 的值是 3,從下標 1 出發(fā)可以達到更遠的位置,因此第一步到達下標 1。
從下標 1 出發(fā),最遠可到達下標 4。下標 1 可到達的位置中,下標 4 的值是 4 ,從下標 4 出發(fā)可以達到更遠的位置,因此第二步到達下標 4。

class Solution {
    public int jump(int[] nums) {
       int length = nums.length;
       int end = 0;
       int maxPosition = 0;
       int steps = 0;
       for(int i=0;i<length-1;i++){
           maxPosition = Math.max(maxPosition,i+nums[i]);
           if(i==end){
               end = maxPosition;
               steps++;
           }
       }
       return steps;
    }
}

復雜度分析

  • 時間復雜度:O(n)
  • 空間復雜度:O(1)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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