題目:
此題的貪心演算法解法如下。
def
maxsubarray
(nums)
: cur_sum=nums[0]
max_sum=nums[0]
for i in
range(1
,len
(nums)):
cur_sum=
max(nums[i]
,cur_sum+nums[i]
) max_sum=
max(cur_sum,max_sum)
return max_sum
從題目的示例中可以看到,需要在列表[-2,1,-3,4,-1,2,1,-5,4]
中擷取一段連續的數,令其的和能夠最大。
示例的答案是[4,-1,2,1]
。這一段數處在列表的中間區域,為了得到該答案,我們需要做到兩點:
1.[4,-1,2,1]
之前的資料不能被算入到答案數列中來,必須要有方法把前面的[-2,1,-3]
「擋住」。
2.[4,-1,2,1]
之後的資料不能被算入到答案數列中來,必須要有辦法把後面的[-5,4]
「截掉」。
首先我們看第一點,要將前面的資料擋住。為什麼要擋住他們,不讓他們進入到答案數列中呢?顯然,無論是[-2,1,-3]
,[1,-3]
,[-3]
,這些數段的和都小於0,加上他們必然會讓後面的數段總和變小。
第二點,保證後面兩個數不算入答案數列中,顯然,[-5]
,[-5,4]
的和也都是小於0的,加入他們也一定會拖後腿。
貪心演算法的思路就是,計算之前的資料和,再與當前值作比較,如果減少了,就應該把之前的給去掉,也就是隨時去掉會給總和拖後腿的資料。
看**。
cur_sum=nums[0]
max_sum=nums[
0]
初始化了兩個值,乙個是當前的資料和,乙個是資料的最大和。
for i in
range(1
,len
(nums)
):
因為列表中的第乙個數用來當初始化值了,顯然遍歷中再比較的操作就得是從它的下一位開始進行。
cur_sum=
max(nums[i]
,cur_sum+nums[i]
)
核心**第一句:比較當前的資料和與當前資料,取最大值。
什麼意思呢,當前的資料和,比當前資料還小。這就好比你想要增肥,結果吃了這個雞腿不僅沒胖反而瘦了,那這雞腿還能吃嗎?越吃越瘦這還怎麼增肥呢?所以這個雞腿不能吃,同理這個當前的資料和也不能要,要丟棄。
丟棄的方式很簡單,如果當前資料和比當前資料小,就直接讓當前資料成為新的當前資料和,當前資料和只有當前資料了,就等於之前的資料全丟了。
帶入到示例中,[-2,1,-3]
,[1,-3]
,[-3]
,無論怎麼加,都是負的,也就是說和數字4
加起來,都會讓數字4
減少,因此這三個數就會被拋棄掉,令4
成為當前資料和。依靠這種辦法,我們擋住了答案數列前面拖後腿的資料。
max_sum=
max(cur_sum,max_sum)
貪心演算法(leetcode)
1 分糖果 455 用最小的糖果大小滿足需求最小的孩子 class solution else return count 2 搖擺序列 376 遍歷一次,儲存乙個狀態,如果狀態為上公升,變為下降,則長度 1,下降變上公升 1 class solution def wigglemaxlength se...
LeetCode 貪心演算法
12.15 135.12.21 435.假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i,都有乙個胃口值 g i 這是能讓孩子們滿足胃口的餅乾的最小尺寸 並且每塊餅乾 j,都有乙個尺寸 s j 如果 s j g i 我們可以將這個餅乾 j 分配給孩...
leetcode 貪心演算法
貪心演算法中,是以自頂向下的方式使用最優子結構,貪心演算法會先做選擇,在當時看起來是最優的選擇,然後再求解乙個結果的子問題。貪心演算法是使所做的選擇看起來都是當前最佳的,期望通過所做的區域性最優選擇來產生乙個全域性最優解 如最小生成樹 dijkstra單源最短路徑 貪心選擇性質 所謂貪心選擇性質是指...