貪心演算法又稱為貪婪法,是用來尋找最優解問題的常用方法。與動態規劃不同的是,貪心演算法在求解問題時,總是選擇對於當前子問題最好的選擇。也就是貪心演算法的本質是每次只顧眼前利益,並且到最後能獲得最大利益。
「貪婪」就像是乙個貪心的人,每次都只能看到眼前(或區域性)的利益最大化,走一步看一步,並且最後能夠得到問題(全域性)利益的最大化。
對於貪心演算法,最重要的就是找到每次的區域性最優解,而動態規劃的關鍵在於找到狀態轉移方程。
步驟一:從乙個初始值開始計算
步驟二:採用迭代的過程,如果能夠向目標問題前進一步,就根據區域性最優策略,得到一部分的解
步驟三:將所有的解綜合起來,得到最終的解
3.1 剪繩子
題目描述:給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為k[0],k[1]...k[m]
。請問k[0]*k[1]*...*k[m]
可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。
演算法分析:將問題分為三種情況,一種是長度小於等於3時,長度為2只能剪成成都為1的兩段;當繩子長度為3時,可能把繩子分成1和2的兩段或者都為1的三段。一種是長度等於4時,把繩子剪成兩段長度為2的繩子。最後一種情況是長度大於等於5時,我們盡量將繩子分為長度為3的繩子。
在 n
>=5
n>=5
n>=5
時,可以證明 2(n
−2
)>
n2(n-2)>n
2(n−2)
>
n 並且 3(n
−3
)>
n3(n-3)>n
3(n−3)
>
n。即當繩子長度大於等於5時,我們把它剪成長度為3或者2的繩子段,此時 3(n
−3
)>=2
(n−2
)3(n-3)>=2(n-2)
3(n−3)
>=2
(n−2
),所以我們應盡可能的剪成長度為3的繩子段。
class
solution
return
(int
)(ans * n %
1000000007);
}};
3.2 不同字元的最小序列
題目描述:返回字串 text 中按字典序排列最小的子串行,該子串行包含 text 中所有不同字元一次。
示例 1:
輸入:"cdadabcc"
輸出:"adbc"
基本概念:
字典序 — 對於字元而言,按 ascii 碼值進行比較,小的排在前,大的排在後。對於字串,從第 0 位字元開始比較,ascii 碼數值小的排在前面,如果相同,就延後一位比較 ascii 碼值大小。
子串行:子串行不同於子串,子串要求它們在原串中連續,而子串行則不要求連續。子串行是原序列通過刪除若干個字元的到的,例如acd是abcd的子串行,但不是子串。
演算法分析:
首先判斷能否使用貪心法
判斷乙個題目能否使用貪心法,最重要的是能否通過區域性最優解得到全域性最優解。題目求解的是字串按字典排序最小的子串行,而且子串行重的字元只能出現一次。
因此我們只要保證所求的子串行從0位開始的每乙個字元都是 ascii 碼值最小的字元,那整個子串行的字典序就是最小的。其中區域性最優就是要子串行每一位的 ascii 碼值是最小的,根據區域性最優解就能得到全劇最優解。
求解區域性最優解,即如何保證子串行從第0位開始 ascii 碼值是最小的。
用示例1作為參考來求解區域性最優解。例如text = "cdadabcc"
,通過遍歷字母表a~z
,從頭到尾依次判斷能否放入子串行中。
首先遍歷到字母a
,我們發現字母a
第一次出現在 text 中的2號位置。然後判斷字母a
之後的字元能否包括題目要求的全部字元,發現後面的字元有d
、b
、c
包括了字串的全部字元,因此字母a
可以作為子串行的第乙個字元。
按照這個思路,我們再填充子串行的下乙個位置。字母a
已經在子串行中,遍歷到字母b
在 text 中,但是字母b
之後的字串不包含字母d
,因此字母b
不能填充,依次我們發現字母d
可以作為子串行的第二個位置填充。
按照這一思路我們依次遍歷完 text 的到最終的結果。
class
solution
//pos表示所選的當前字元在text中的位置
int pos =0;
while
(all)}}
return ret;
}bool
isok
(string& text,
int all,
char ch,
int& pos)
}int p = i+1;
int t =0;
for(
; i < len; i++)}
if(t == all)
return
false;}
};
**實現: 總結 貪心演算法 貪心演算法入門總結
英語 greedy algorithm,又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。貪心演算法在有最優子結構的問題中尤為有效。最優子結構的意思...
總結 貪心演算法 貪心演算法 跳躍遊戲
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例 2 輸入...
貪心演算法總結
第一套題主要用貪心演算法來解決問題,貪心演算法簡單來說就是從區域性最優解,進而求得整體最優解,其中難點就是選擇貪心標準,貪心標準的選擇選的巧妙問題就會變的很簡單,比如第一題搬桌子的題,就是把房間轉化為對應的走廊號,問題就簡化了很多。貪心演算法的題目有的可以很簡單的看出來,常見典型的題有,揹包問題,最...