leetcode題解 貪心演算法

2021-09-11 12:06:32 字數 1970 閱讀 6693

貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。 也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。

通常貪心演算法的**會非常短而且思路也非常的簡單,但貪心演算法真正的難點在於確定我們當前的問題確實可以使用貪心演算法。

這是一道簡單的貪心演算法問題。我們嘗試將最大的餅乾給最貪心的小朋友,如果可以滿足最貪心的小朋友,我們留給下乙個次貪心的小朋友的餅乾也是當前看來最大的。如果最大的餅乾都無法滿足最貪心的小朋友,那麼就表明無法滿足這個小朋友。

class

solution else

}return res;}};

複製**

貪心演算法通常和排序是分不開的,如果題目給出陣列沒有排序,我們就需要自己進行排序。

解題思路

我們可以首先想一下暴力解法:找出所有子區間的組合,之後判斷它是否重疊。o((2^n)*n)

先要排序,方便判斷不重疊。

這道題很像最長上公升子串行我們首先使用動態規劃解決這道題:

實現
// definition for an interval.

struct interval

interval(int s, int e) : start(s), end(e) {}

};bool compare(const interval &a, const interval &b)

// 動態規劃

class solution

sort(intervals.begin(), intervals.end(), compare);

// memo[i]表示以intervals[i]為結尾的區間能構成的最長不重疊區間序列

vectormemo( intervals.size() , 1 );

for( int i = 1 ; i < intervals.size() ; i ++ ) }}

int res = 0;

for( int i = 0 ; i < memo.size() ; i ++ )

return intervals.size() - res;}};

複製**

解題思路
注意:每次選擇中,每個區間的結尾很重要。

結尾越小,留給了後面越大的空間,後面越有可能容納更多區間。

貪心演算法:按照區間的結尾排序,每次選擇結尾最早的,且和前乙個區間不重疊的區間。

實現
// definition for an interval.

struct

interval

interval(int s, int e) : start(s), end(e) {}

};bool

compare

(const interval &a, const interval &b)

// 貪心演算法

class

solution

sort(intervals.begin(), intervals.end(), compare);

int res = 1;

int pre = 0;

for( int i = 1 ; i < intervals.size() ; i ++ )

}return intervals.size() - res;}};

複製**

-------------------------華麗的分割線--------------------

看完的朋友可以點個喜歡/關注,您的支援是對我最大的鼓勵。

個人部落格番茄技術小棧和掘金主頁

LeetCode貪心演算法題解

leetcode 860.檸檬水找零 題幹 在檸檬水攤上,每一杯檸檬水的售價為 5 美元。顧客排隊購買你的產品,按賬單 bills 支付的順序 一次購買一杯。每位顧客只買一杯檸檬水,然後向你付 5 美元 10 美元或 20 美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付 5 美元。...

貪心演算法(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 分配給孩...