LeetCode 貪心演算法

2021-10-12 00:22:11 字數 3552 閱讀 2239

12.15 135.

12.21 435.

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

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

示例 1:

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

輸出: 1

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

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

所以你應該輸出1。

示例 2:

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

輸出: 2

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

你擁有的餅乾數量和尺寸都足以讓所有孩子滿足。

所以你應該輸出2.

**:

class

solution

return g1;}}

;

標頭檔案:#include

記住:using

namespace std;

定義:1.vector<

int>g;vector<

int>

& g;

2.vector

v3(n,val)

//v3中有n個重複的元素,每個元素的值都是val

3.int arr[5]

=;vector<

int>

v5(arr,

&arr[5]

);//以區間[beg;end)做為初值的vector;

//另arr可以寫成&arr[0]

輸入:g.

push_back()

;排序:sort(g.

begin()

,g.end

());

輸出:for(int i=

0;isize

();i++)

標頭檔案:#include

//數值計算庫

對vector累加求和

1.int sum =

accumulate

(vec.

begin()

, vec.

end(),

42);//42為起始值

2.string sum =

accumulate

(v.begin()

, v.

end(),

string

(" "))

;//空格為起始值

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

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

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

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

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

示例 1:

輸入: [1,0,2]

輸出: 5

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

示例 2:

輸入: [1,2,2]

輸出: 4

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

第三個孩子只得到 1 顆糖果,這已滿足上述兩個條件。

**:

class

solution

vector<

int>

num(size,1)

;for

(int i=

1;i++i)

}for

(int i=size-

1;i>0;

--i)

}return

accumulate

(num.

begin()

,num.

end(),

0);}

};

for迴圈裡,因為是比較,不是讀取,i從1開始。

++i 和 i++ 區別在於:++i 返回加1之後的值,i++返回之前的值。

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

注意:

可以認為區間的終點總是大於它的起點。

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

示例 1:

輸入: [ [1,2], [2,3], [3,4], [1,3] ]

輸出: 1

解釋: 移除 [1,3] 後,剩下的區間沒有重疊。

示例 2:

輸入: [ [1,2], [1,2], [1,2] ]

輸出: 2

解釋: 你需要移除兩個 [1,2] 來使剩下的區間沒有重疊。

示例 3:

輸入: [ [1,2], [2,3] ]

輸出: 0

解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。

**:

class

solution

int n=intervals.

size()

;sort

(intervals.

begin()

,intervals.

end(),

(vector<

int>a,vector<

int>b));

int total=

0,prev=intervals[0]

[1];

for(

int i=

1;i++i)

else

}return total;}}

;

與lambda連用:sort(intervals.begin(),intervals.end(),(vectora,vectorb),,

};sort

(students.

begin()

, students.

end(),

(student& a, student& b)

->

bool

);return前多了乙個 -> ,多了乙個bool宣告。

下面是乙個合法的lambda表示式:

[=]

(int x,

int y)

->

bool

lambda 表示式的定義形式如下:

[外部變數訪問方式說明符]

(參數列)

-> 返回值型別

其中,「外部變數訪問方式說明符」可以是=或&,表示{}中用到的、定義在{}外面的變數在{}中是否允許被改變。=表示不允許,&表示允許。當然,在{}中也可以不使用定義在外面的變數。「-> 返回值型別」可以省略。

貪心演算法(leetcode)

1 分糖果 455 用最小的糖果大小滿足需求最小的孩子 class solution else return count 2 搖擺序列 376 遍歷一次,儲存乙個狀態,如果狀態為上公升,變為下降,則長度 1,下降變上公升 1 class solution def wigglemaxlength se...

leetcode 貪心演算法

貪心演算法中,是以自頂向下的方式使用最優子結構,貪心演算法會先做選擇,在當時看起來是最優的選擇,然後再求解乙個結果的子問題。貪心演算法是使所做的選擇看起來都是當前最佳的,期望通過所做的區域性最優選擇來產生乙個全域性最優解 如最小生成樹 dijkstra單源最短路徑 貪心選擇性質 所謂貪心選擇性質是指...

LeetCode 貪心演算法

保證每次操作都是區域性最優的,並且最後得到的結果是全域性最優的。455.分發餅乾 題目描述 每個孩子都有乙個滿足度,每個餅乾都有乙個大小,只有餅乾的大小大於等於乙個孩子的滿足度,該孩子才會獲得滿足。求解最多可以獲得滿足的孩子數量。示例 輸入 1,2,3 1,1 輸出 1 解釋 你有三個孩子和兩塊小餅...