Leetcode--跳躍遊戲 II

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

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

你的目標是使用最少的跳躍次數到達數組的最後一個位置。

示例:

輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
     從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。
說明:

假設你總是可以到達數組的最後一個位置。

思路

使用貪心的思想,每次搜索可以到達的最遠距離的下標

class Solution {
public:
    int jump(vector<int>& nums) {

        int size= nums.size(), sum= 0;
        // 記錄可以到達的最遠的地方和開始的下標
        int maxpos= 0, index;
        for(int i= 0; i< size- 1; ){
            maxpos= i, index= i;
            for(int j= i; j- i<= nums[i]&& j< size- 1; ++j){
                // 搜索最遠距離的下標
                if(maxpos< j+ nums[j]){
                    maxpos= j+ nums[j];
                    index= j;
                    if(maxpos>= size- 1) break;
                }
            }
            i= i== index? maxpos: index;
            ++sum;
            if(index>= size- 1) break;
        }
        return sum;     
    }
};

參考官方題解對代碼進行了簡化

class Solution {
public:
    int jump(vector<int>& nums) {

        int size= nums.size(), sum= 0;
        int maxpos= 0, end= 0;
        // 搜索每段(i到end)的最遠距離
        for(int i= 0; i< size- 1; ++i){
            maxpos= max(maxpos, i+ nums[i]);
            if(i== end){
                end= maxpos;
                ++sum;
            }
        }
        return sum;     
    }
};

 

 

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