演算法解釋:貪心演算法採用貪心的策略,保證每次操作都是
區域性最優的,從而使最後得到的結果是
全域性最優的。
題目描述:
假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。
對每個孩子 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的貨船種,每個貨櫃的質量由使用者自己輸入指定,在貨船的裝載體積不限的前提下,如何裝載貨櫃才能盡...