【LeetCode】55.跳躍遊戲

  • 題目描述

    給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後一個位置。

    示例 1:

    輸入: [2,3,1,1,4]

    輸出: true

    解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後一個位置。

     

    示例 2:

    輸入: [3,2,1,0,4]

    輸出: false

    解釋: 無論怎樣,你總會到達索引爲 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。

 

  • 思路

  1. 動態規劃

    假設輸入的非負數組爲nums,那麼某個位置i可以到達的區間爲[i+1,i+nums[i]],如果在這個區間內的任一位置能到達最後的位置,那麼位置i就可以到達最後的位置。

    通過上面的分析,我們可以從後往前來依次確定每個位置是否可以到達最後的位置;

  2. 貪心

    在動態規劃中,爲了確定i是否能到達最後的位置,需要掃描右邊的nums[i]個位置,但是這個掃描是完全沒有必要的,因爲可以直接記錄上一個可以到達最後的位置的位置;

  • C++實現

  1. 動態規劃
    bool canJump(vector<int>& nums){
            int size = nums.size();
            if(size==0)return true;
            vector<int> res(size); // 0表示不能到達,1表示能到達
            res[size-1] = 1; //最後的位置設爲1
            for(int i=size-2;i>=0;i--){//從倒數第2個位置,依次確定是否可以到達最後的位置
                int furthestJump = min(i+nums[i],size-1);//最遠可以到達的位置
                for(int j=i+1;j<=furthestJump;j++){
                    if(res[j]==1){
                        res[i]=1;
                        break;
                    }
                }
            }
            return res[0]==1;
        }

    時間複雜度:對於位置i,需要掃描min(nums[i],n)個位置,其中n是數組長度,因此時間複雜度爲

  2. 貪心
    bool canJump(vector<int>& nums){
            int lastPos = nums.size()-1;
            for(int i = nums.size()-1;i>=0;i--){
                if(i+nums[i]>=lastPos)
                    lastPos = i;
            }
            return lastPos==0;
       }

    時間複雜度:只掃描一次,時間複雜度

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