力扣之最易懂的貪心演算法

2021-10-11 21:59:10 字數 4476 閱讀 1775

演算法解釋:貪心演算法採用貪心的策略,保證每次操作都是

區域性最優的,從而使最後得到的結果是

全域性最優的。

題目描述:

假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。

對每個孩子 i,都有乙個胃口值 g[i],這是能讓孩子們滿足胃口的餅乾的最小尺寸;並且每塊餅乾 j,都有乙個尺寸 s[j] 。如果 s[j] >= g[i],我們可以將這個餅乾 j 分配給孩子 i ,這個孩子會得到滿足。你的目標是盡可能滿足越多數量的孩子,並輸出這個最大數值。

示例:

輸入: g = [1,2,3], s = [1,1]

輸出: 1

解釋:

你有三個孩子和兩塊小餅乾,3個孩子的胃口值分別是:1,2,3。

雖然你有兩塊小餅乾,由於他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。

所以你應該輸出1。

一句話思路:

貪心策略是,給剩餘孩子裡最小飢餓度的孩子分配最小的能飽腹的餅乾。

具體實現,因為我們需要獲得大小關係,需要把把孩子和餅乾分別排序。

這樣我們就可以從飢餓度最小的孩子和大小最小的餅乾出發,計算有多少對可以滿足條件。

**:

class

solution

:def

findcontentchildren

(self, g: list[

int]

, s: list[

int])-

>

int:

g.sort(

) s.sort(

) i, j =0,

0while i <

len(g)

and j <

len(s)

:if g[i]

<= s[j]

: i +=

1 j +=

1return i

題目描述:

老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。

你需要按照以下要求,幫助老師給這些孩子分發糖果:

每個孩子至少分配到 1 個糖果。

相鄰的孩子中,評分高的孩子必須獲得更多的糖果。

那麼這樣下來,老師至少需要準備多少顆糖果呢?

示例:

輸入:[1,

0,2]

輸出:5

解釋: 你可以分別給這三個孩子分發 2、1、2 顆糖果。

一句話思路:

初始所有孩子為1。

先從左往右遍歷陣列,如果右邊孩子的評分比左邊的高,則右邊孩子的糖果數更新為左邊孩子的糖果數加 1;

再從右往左遍歷一遍,如果左邊孩子的評分比右邊的高,且左邊孩子當前的糖果數不大於右邊孩子的糖果數,則左邊孩子的糖果數更新為右邊孩子的糖果數加 1。

從左往右:保證i-1 >= 0,索引要從1開始;

從右往左遍歷,正常索引;

**:

class

solution

:def

candy

(self, ratings: list[

int])-

>

int:

n =len(ratings)

if n <2:

return n

nums =[1

]*nfor i in

range(1

,n):

if ratings[i]

> ratings[i -1]

: nums[i]

= nums[i-1]

+1for i in

range

(n-1,0

,-1)

:if ratings[i]

< ratings[i-1]

: nums[i-1]

=max

(nums[i-1]

, nums[i]+1

)return

sum(nums)

題目描述:

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。

注意:區間的終點總是大於它的起點。

區間 [1,2] 和 [2,3] 的邊界相互「接觸」,但沒有相互重疊。

示例:

輸入:[[1

,2],

[2,3

],[3

,4],

[1,3

]]輸出:1

解釋: 移除 [1,

3] 後,剩下的區間沒有重疊。

一句話思路:

貪心策略為,優先保留結尾小且不相交的區間。

先把區間按照結尾的大小進行增序排序,每次選擇結尾最小且和前乙個選擇的區間不重疊的區間。

相交,跳過,該區間要去掉,count+1;不相交,保留。

**:

class

solution

:def

eraseoverlapintervals

(self, intervals: list[list[

int]])

->

int:

n =len(intervals)

if n ==0:

return

0#可以順便學習python sorted和sort的區別

#按照每個小區間的後乙個元素大小排序

intervals =

sorted

(intervals, key =

lambda x:x[1]

) count =

0 pre_end = intervals[0]

[1]for i in

range(1

, n)

:if intervals[i][0

]< pre_end:

count +=

1else

: pre_end = intervals[i][1

]return count

題目描述:

假設你有乙個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。

給定乙個花壇(表示為乙個陣列包含0和1,其中0表示沒種植花,1表示種植了花),和乙個數 n 。能否在不打破種植規則的情況下種入 n 朵花?能則返回true,不能則返回false。

輸入: flowerbed =[1

,0,0

,0,1

], n =

2輸出:

false

輸入: flowerbed =[1

,0,0

,0,1

], n =

1輸出:

true

一句話思路:

除了首尾需要區別判斷,其餘情況只要有連續三個0,即可將當前位置置為1,count+

+

**:

class

solution

:def

canplaceflowers

(self, flowerbed: list[

int]

, n:

int)

->

bool

: count =

0 m =

len(flowerbed)

for i in

range

(m):

if flowerbed[i]==0

and(i ==

0or flowerbed[i-1]

==0)and

(i == m-

1or flowerbed[i+1]

==0):

flowerbed[i]=1

count +=

1#比較跟n的大小

return count >= n

貪心演算法之最優裝船

在乙個固定重量的貨船中裝最大重量的貨櫃,忽略空間 如最大重量是15 而我有五個箱子重量分別為 2 4 66 8 60 那麼我裝入的箱子應該為第1 2 4個 我現在有兩個陣列,乙個w 5 儲存這五個箱子的重量另乙個x 5 儲存這五個箱子的下標 當我的w 5 安找遞增的順序排列後,我只需要順序相加小於我...

貪心演算法 (新手易懂)

貪心演算法的意思就是求乙個問題時求它的子問題的最優解,從而求得問題的最優解,貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。下面講解例題 例題大致意思就是,給你每乙個節目的開始時間和結束時間,...

貪心演算法之最優裝船問題

越來越發現自己的程式設計功底很差,於是近期打算惡補下。看到一題目,初見覺得很簡單,但是實際程式設計的時候,可能是由於自己的基本功太弱的原因吧,還是花費了很長的時間的。題目如下 有一批貨櫃要裝入乙個載質量為c的貨船種,每個貨櫃的質量由使用者自己輸入指定,在貨船的裝載體積不限的前提下,如何裝載貨櫃才能盡...