1. 程式人生 > 其它 >力扣55. 跳躍遊戲

力扣55. 跳躍遊戲

55.跳躍遊戲

55.跳躍遊戲
難度:中等
給定一個非負整數陣列 nums ,你最初位於陣列的 第一個下標 。

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

判斷你是否能夠到達最後一個下標。

** **

示例 1:

輸入:nums = [2,3,1,1,4]
輸出:true
解釋:可以先跳 1 步,從下標 0 到達下標 1, 然後再從下標 1 跳 3 步到達最後一個下標。
示例 2:

輸入:nums = [3,2,1,0,4]
輸出:false
解釋:無論怎樣,總會到達下標為 3 的位置。但該下標的最大跳躍長度是 0 , 所以永遠不可能到達最後一個下標。

分析:
用貪心法,遍歷陣列每個元素,記錄從當前下標和對應的元素,確定能夠到達的最大距離,若大於當前最大距離則更新,否則不變。

以題目中的示例一
[2, 3, 1, 1, 4]
為例:

我們一開始在位置 0,可以跳躍的最大長度為 2,因此最遠可以到達的位置被更新為 2;

我們遍歷到位置 1,由於 1≤2,因此位置 1 可達。我們用 1 加上它可以跳躍的最大長度 3,將最遠可以到達的位置更新為 4。由於 4 大於等於最後一個位置 4,因此我們直接返回 True。

我們再來看看題目中的示例二

[3, 2, 1, 0, 4]
我們一開始在位置 0,可以跳躍的最大長度為 3,因此最遠可以到達的位置被更新為 3;

我們遍歷到位置 1,由於 1≤3,因此位置 1 可達,加上它可以跳躍的最大長度 2 得到 3,沒有超過最遠可以到達的位置;

位置 2、位置 3 同理,最遠可以到達的位置不會被更新;

我們遍歷到位置 4,由於 4>3,因此位置 4 不可達,我們也就不考慮它可以跳躍的最大長度了。

在遍歷完成之後,位置 4 仍然不可達,因此我們返回 False。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int maxlen=0;
        int a=0;
        for(int i=0;i<nums.size();i++)
        {
            if(i<=maxlen){
                a=nums[i];
                maxlen=max(maxlen,a+i);
                if(maxlen>=nums.size()-1)
                return true;
            }
        }
        return false;

    }
};