貪心法&跳躍遊戲

什麼是貪心法?

  貪心法本質上講不是一種真正的算法,而是一種思想,就是解決問題的時候遵循着某種規則,不斷貪心地選取當前最優策略,以達到結果最優的目的。比如硬幣問題,給出1元、5元、10元、50元、100元的硬幣各a、b、c、d、e個,問用這些硬幣來支付A元,最少需要多少枚硬幣?

  很容易想到先用面額大的錢,依次往小即可。這就是貪心法的典型應用,只顧眼前的利益最大化,從而達到總體最優的效果。

1、跳躍遊戲

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

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

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

示例 1:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/jump-game/

思路:儘可能到達最遠位置(貪心)。
如果能到達某個位置,那一定能到達它前面的所有位置。

方法:初始化最遠位置爲0,然後遍歷數組,如果當前位置能到達,並且當前位置+跳數>最遠位置,就更新最遠位置。最後比較最遠位置和數組長度。

複雜度:時間複雜度O(n),空間複雜度O(1)。

 def canJump(self, nums):
        if not nums:
            return False
        last = 0
        n = len(nums)
        for i, step in enumerate(nums): # i爲當前位置,step是當前位置的跳數
            if i <= last <= i + step:   # 如果當前位置能到達,並且當前位置+跳數>最遠位置  
            if last >= n - 1:
                return True
        return False

2、跳躍遊戲 II

定一個非負整數數組,你最初位於數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達數組的最後一個位置。

示例:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/jump-game-ii/

方法:

每次在可跳範圍內選擇可以使得跳的更遠的位置。如下圖,開始的位置是 2,可跳的範圍是橙色的。然後因爲 3 可以跳的更遠,所以跳到 3 的位置。

image.png

如下圖,然後現在的位置就是 3 了,能跳的範圍是橙色的,然後因爲 4 可以跳的更遠,所以下次跳到 4 的位置。

image.png

    def jump(self, nums):
        if not nums:
            return 0
        step = 0 # 步長
        end = 0  # end 表示當前能跳的邊界
        max_bound = 0  # 局部最遠位置
        for i in range(len(nums) - 1):
            max_bound = max(max_bound, nums[i] + i)
            if i == end:
                step += 1
                end = max_bound
        return step

 

 

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