什麼是貪心法?
貪心法本質上講不是一種真正的算法,而是一種思想,就是解決問題的時候遵循着某種規則,不斷貪心地選取當前最優策略,以達到結果最優的目的。比如硬幣問題,給出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 的位置。
如下圖,然後現在的位置就是 3 了,能跳的範圍是橙色的,然後因爲 4 可以跳的更遠,所以下次跳到 4 的位置。
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