1. 程式人生 > >LeetCode 跳躍遊戲問題

LeetCode 跳躍遊戲問題

問題描述:

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

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

判斷你是否能夠到達最後一個位置。

示例1:

輸入: [2,3,1,1,4]
輸出: true
解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後一個位置。

示例2:

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

題意分析:要想判斷能否到達最後一個位置就可以轉換為判斷判斷起點和終點是否可達的問題,首先記錄第一個位置(0下標處)的數字(假設為w),然後判斷其之後的第i到w個位置上的數字加其下標所得到的值是否大於w,如果有大於的則將其賦值給w,並判斷是否>=陣列的大小,如果是則返回true;如果不是則繼續迴圈(遞迴)上述的步驟,直到訪問到倒數第二個元素為止,如果依舊不能,則返回false;

解題思路:LeetCode在時間複雜度上對程式碼有一定的要求,所以就採用了迴圈,當然也可以採用遞迴的方法來實現。

程式碼實現:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int answer=nums[0];
        for(int i=1;i<nums.size();i++)
        {
            if(i<=answer)/*如果i代表的對應元素的下標 在上一個起始下標的單元內的數字的範圍內,那麼則可以將它能表示的範圍加入nums[i]中,如果比answer大則代替answer*/
            {
                answer=(nums[i]+i)>answer?(nums[i]+i):answer;
                if(answer+1>=nums.size())//還需要加上起始位置本身的位置
                    return true;
            }
        }
         if(nums.size()==1)
            return true;
        
        return false;
    }
   
};