leetcode 貪心演算法筆記

2021-10-21 11:55:15 字數 1866 閱讀 3788

題目:

此題的貪心演算法解法如下。

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單源最短路徑 貪心選擇性質 所謂貪心選擇性質是指...