leetcode —— 45. 跳躍遊戲 II

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

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

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

示例:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/jump-game-ii
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

————————————
解題思路:
(1)使用貪心算法;

(2)使用max_pos保存當前步所能到達的最遠距離,比如例子中的nums[0]表示從index=0的位置所能到達的最遠距離爲index=2,這時候走了一步,使用step記錄走的步數,step=1;

(3)在nums[1-2]的距離內,記錄在num[1-2]所能到達的最遠距離,由例子可以知道,nums[1-2]能到達的最遠距離爲index=4,也就是到達index=4的位置所需要的最少步數爲step=2;因爲index=4爲數組的最後一位,因此可以返回2作爲結果;

其Python3代碼如下:

# Python3
class Solution:
    def jump(self, nums: List[int]) -> int:
        n = len(nums)
        # maxPos用於保存當前nums[,end]所能到達的最遠距離;
        # step用於記錄最大步數
        maxPos, end, step = 0, 0, 0
        for i in range(n - 1):
            # end是當前step的最遠距離
            if i <= end: 
                # 更新當前nums[:end]可以到達的最遠距離maxPos
                maxPos = max(maxPos, i + nums[i])
                # 當到達邊界,則更新下一步的邊界,並更新步數
                if i == end:
                    end = maxPos
                    step += 1
        return step

其C++代碼如下:

class Solution {
public:
    int jump(vector<int>& nums) 
    {
        int length = nums.size();
        int max_pos = 0;
        int end = 0;
        int time = 0;
        for(int i=0;i<length-1;++i)
        {
            if(i<=end)
            {
                max_pos = max(max_pos,nums[i]+i);
                if(i==end)
                {
                    end = max_pos;
                    time++;
                }
            }
        }
        return time;
    }
};

代碼時間複雜度爲O(n),n爲數組長度;空間複雜度爲O(1);

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