一、Greedy Algorithm
1.1 基本觀念介紹
Greedy Algorithm (貪婪演算法) 是指在對問題求解時,總是做出在當前看起來最好的選擇,所以此種演算法在解問題時,不是所有題型都能得到 global optimization (全域最佳解),但對於相當多問題能產生整體最佳解或者是近似整體最佳解。
總之貪婪演算法的精神就是 : 短視近利、今朝有酒今朝醉,每一步面臨選擇時,都做眼前最有利的選擇,不考慮對將來是否有不良的影響,與 dynamic programming 不同,不會保留計算結果。
假設現在有個金額 M,有 1、5、10、20、50 元這些幣值種類,要盡可能用最少的錢幣湊到金額 M。根據貪婪演算法,能用 50 的就盡量用 50 的,否則盡量用 20 的...以此類推;在這種策略下,M 若是 15 則等於 10 * 1 + 5 * 1,共使用了 2 種錢幣。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let normalCoins = [1, 5, 10, 20, 50]; | |
let moneyForGreedy = function (coins, amount) { | |
let coinsLeng = coins.length; | |
let number = []; | |
for (let i = coinsLeng - 1; i >= 0; i--) { | |
number[i] = Math.floor(amount / coins[i]); | |
amount = amount - number[i] * coins[i]; | |
} | |
return number.reduce((a, b) => a + b); | |
}; | |
console.log(moneyForGreedy(normalCoins, 15)); // 2 |
但是如果我們換一組錢幣的種類如 1、5、11,貪婪演算法可能就不是最佳解。
或是我們有一個最多能背重量為 W 的背包,現在有 N 件物品,每件物品只能用一次且價值不相等,求解將哪些物品裝入背包裡物品價值總和最大,這時候因為要同時考慮重量和價值,也沒辦法用貪婪就取得最佳解。
這在下一篇 Dynamic Programming (動態規劃) 會講解到。
1.2 實際運用範例
Huffman Encoding、旅行推銷員問題等等。
二、題目整理
Greedy algorithm 常出現之 LeetCode 題目整理
關於這個 excel 表,你可以 :
- 題號 : 根據 LeetCode 題目出現的頻率, top interview 150 等整理的,但注意不代表這就涵蓋所有面試會考的題目。或你可以選擇 Grind 來安排你要刷的題目
- 難度 : 按照你現在想要的難度選擇刷題
- 重要性 : 比如說你注意到、或別人提到 Google 很常考這個題目之類,可以設定你覺得相對的重要性,之後可以拿來篩選用
- 第一次是否解出來 : 紀錄解題是否第一次就成功,若不成功可能需要複習
- 解題思路 : 題目的思路過程,寫大綱就好不用寫很詳細
- 其他解法 : 若解出來是否還可以想到其他解法,或是看到別人提供了更好的解法便記錄下來,在面試時還可以提出自己有不同解法
- 學到技巧 : 如此題可以用 two pointer 來解,寫下來下次遇到別的題目就可以知道說我多一個解法可以想想看可不可行
- 複習次數 : 用來記錄第一次解不出來的題目之練習次數
- 複習筆記 : 有可能再做一次還是解不出來,那可寫下這次癥結點是什麼,怎麼解決的,盡量完全理解解法,讓自己如果再做一次題目時若還是卡住,可以看筆記或是回想筆記試圖解出來
- 上次解題時間 : 可用來篩選下次該複習的題目
三、References
--
相關文章
- Coding Interview 就是刷好刷滿刷爆 LeetCode 就會上?
- 簡單輕鬆十分鐘看懂 Time complexity & Space complexity 分析刷 LeetCode
- 簡單輕鬆十分鐘學會 Hash Map (雜湊表) 刷 LeetCode
- 簡單輕鬆十分鐘 Linked List (鍊表) 刷 LeetCode
- 簡單輕鬆十分鐘學會 Recursion (遞迴) 刷 LeetCode
- 簡單輕鬆十分鐘學會 Stack & Queue (堆疊 & 佇列) 刷 LeetCode
- 簡單輕鬆十分鐘學會 Tree & Binary tree & Binary search tree 刷 LeetCode
- 簡單輕鬆十分鐘學會 Heap (堆疊) 刷 LeetCode
- 簡單輕鬆十分鐘學會 Graph (圖) 刷 LeetCode
沒有留言:
張貼留言