貪心演算法是指對子問題取最值,從而求得區域性最優解,並以此求得全域性最優解。貪心演算法可以認為是動態規劃的乙個特例,同樣是需要將問題分解為子問題,避免了子問題的重複計算,只不過在子問題的處理上貪心演算法更加簡單直接。貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。
舉個簡單的例子,有10、5、3面額的鈔票各若干張,現在規定只能拿10張,問最多能拿多少錢。顯然每次都拿剩下鈔票中最大的面額,最後能取得最優解。但是如果換成湊夠某金額最少的鈔票數,那麼貪心演算法沒辦法得到最優解,因為每次取最大面額,最後可能出現面額不合適,從而使用大量小面額湊零,反而增加了鈔票數,面對這種問題,貪心策略就不具備無後效性。
以上介紹了貪心演算法的概念及侷限性,對於符合貪心策略的問題,基本思路如下:
跳躍遊戲(leetcode-55)
我們把此類為題轉變為最值問題,即跳躍最遠距離覆蓋最後乙個位置認為能夠達到最後乙個位置。那麼求最遠跳躍距離可以分解為求每一步跳躍的最遠距離,貪心演算法具體思路如下:
bool canjump(vector&nums)每一步都計算一下從當前位置最遠能夠跳到**,然後和乙個全域性最優的最遠位置farthest做對比,通過每一步的最優解,更新全域性最優解。相對於動態規劃,貪心演算法的優勢在於,時間複雜度為o(n),空間複雜度為o(1),但是使用時必須滿足貪心演算法的條件。return farthest >= n - 1
;}
跳躍遊戲 ιι(leetcode-45)
下面再將問題公升級為求最少跳躍次數,同樣可使用貪心演算法解決。
解題思路為:每一步必須跳,那麼就求出每一步能夠跳的最遠距離,即將原問題分解為每一步跳躍使得後續的可跳距離最遠。如下圖所示,位置0最大可跳2個位置,具體跳到位置1還是位置2呢?由於位置1可跳範圍比位置2更遠,所以在位置0選擇跳到位置1,之後每一步都按照同樣的策略取下一跳位置。
**如下:
int jump(vector&nums)return
step;
}
五大常用演算法之貪心演算法
五大常用演算法之貪心演算法 貪心演算法 貪婪演算法 指的是 在對問題求解過程中,總是做出在當前看來是最好的選擇。不從整體最優上加以考慮,所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響...
五大演算法三 貪心演算法
一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...
五大常用演算法 貪心演算法
一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...