LeetCode 貪心演算法

2022-08-13 13:51:26 字數 1831 閱讀 7330

保證每次操作都是區域性最優的,並且最後得到的結果是全域性最優的。

455. 分發餅乾

題目描述:每個孩子都有乙個滿足度,每個餅乾都有乙個大小,只有餅乾的大小大於等於乙個孩子的滿足度,該孩子才會獲得滿足。求解最多可以獲得滿足的孩子數量。

示例

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

輸出: 1

解釋:

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

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

所以你應該輸出1。

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

輸出: 2

解釋:

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

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

所以你應該輸出2.

解法

貪心問題。優先滿足胃口小的小朋友的需求。

對 g 和 s 公升序排序

初始化兩個指標分別指向 g 和 s 初始位置

對比 g[i] 和 s[j]

g[i] <= s[j]:餅乾滿足胃口,孩子指標右移

g[i] > s[j]:無法滿足胃口

無論滿不滿足胃口,都要右移餅乾指標

最後返回的就是小孩的指標移動的次數

class solution:

def findcontentchildren(self, g: list[int], s: list[int]) -> int:

g, s = sorted(g), sorted(s)

p1, p2 = 0, 0

while p1 < len(g) and p2 < len(s):

if g[p1] <= s[p2]:

p1 += 1

p2 += 1

return p1

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

示例

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

輸出: 1

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

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

輸出: 2

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

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

輸出: 0

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

解法

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

class solution:

def eraseoverlapintervals(self, intervals: list[list[int]]) -> int:

if not intervals:

return 0

intervals = sorted(intervals,key=lambda x:x[-1])

curr = 0

count = 1

for i in range(1, len(intervals)):

if intervals[curr][1] <= intervals[i][0]:

count += 1

curr = i

return len(intervals)-count

452. 用最少數量的箭引爆氣球

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