演算法面試8 貪心演算法

2022-08-16 10:12:12 字數 2294 閱讀 5932

目錄

1 簡單貪心

leetcode 455-分發餅乾

leetcode 392-判斷子串行

2 貪心與動態規劃的關係

3 貪心選擇性

1 簡單貪心

貪心演算法相對來說**少,思路簡單,但貪心問題的關鍵是確定乙個問題能否使用貪心演算法去解決。

例1:leetcode 455。題解:把最大的餅乾分給最貪心的還在,那麼剩下的餅乾中就是次大的分給次貪心的孩子即還是當前最大的餅乾分給最貪心的孩子。在貪心演算法中,常常要涉及到最大,最小這些資料因此常常需要進行排序。

class

solution

j++; //

否則尋找更大的餅乾

}

return i; //

因為i是從0開始的所以直接返回便是滿足孩子需求的數目

}}

與此類似題目:leetcode 392。

2 貪心與動態規劃的關係

例1:leetcode 435。題目中是最少需要移除多少區間使得區間不重疊那麼也可以理解為最多保留多少個區間使得區間不重疊。暴力思路就是找出所有的子區間然後判斷是否重疊,為了判斷重疊時方便可以先進行排序,對於組合問題大都可以用動態規劃進行優化解決。如果從動態規劃去理解,給定乙個拍好序的區間,保留最多的區間使得區間不重疊,那麼就很類似與最長上公升子串行問題。

class

interval

interval(

int s,inte)}

class intervalscomparator implements comparator

return o1.end < o2.end ? -1 : 1;

}}public

class

solution

arrays.sort(intervals,

newintervalscomparator());

//memo[i] 表示使用intervals[0...i]的區間能構成的最長不重疊區間序列

int memo = new

int[intervals.length];

//設定初始值

arrays.fill(memo, 1);

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

//在所有的memo中取最大值

int res = 0;

for (int i = 0; i < intervals.length; i++)

//返回需要刪除的區間數

return intervals.length -res;}}

可以注意到:每次選擇中,每個區間的結尾很重要,結尾越小,留給後面越大的空間,後面越有可能容納更多區間。那麼貪心演算法便可以採用如下思路:按照區間的結尾排序,每次選擇結尾最早的,且和前乙個區間不重疊的區間。

public

class

solution

arrays.sort(intervals,

newintervalscomparator());

int res = 1;

int pre = 0;

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

}return intervals.length -res;}}

3 貪心選擇性

2中使用了動態規劃解決,也可以採用貪心解決,但不意味著動態規劃可以解決的貪心一定能解決。上面例子中之所以能解決是因為滿足了乙個性質:貪心選擇性:在求解最優化問題中,使用了貪心的方式選擇了一組資料後,不會影響子問題的求解。因為這個性質一般正面很難去證明,所以在問題求解中一般是舉出反例。如在0-1揹包問題中,就舉出了乙個貪心演算法的反例,還有如leetcode 279中可以舉出反例如下:按照貪心的思路肯定是先選擇距離給定數字最接近的完全平方數那麼12=9+1+1+1但是12=4+4+4才是最優的。

證明如下:

在這裡給出貪心演算法證明的一般思路:

玩轉演算法面試(九) 貪心演算法

假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i 都有乙個胃口值 gi 這是能讓孩子們滿足胃口的餅乾的最小尺寸 並且每塊餅乾 j 都有乙個尺寸 sj 如果 sj gi 我們可以將這個餅乾 j 分配給孩子 i 這個孩子會得到滿足。你的目標是盡可能滿足...

演算法 貪心演算法

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...

演算法 貪心演算法

集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...