一.什么是貪心算法?
貪心算法又稱之為貪婪算法,在考慮問題時,總是做出在當前狀況來說最好的算則,而不從整理來考慮。從某種意義上說是局部最優解,貪心算法所得到的答案並不一定是整體最優解,所以在使用貪心算法一定要考慮清楚,是否能使用貪心算法。
選擇的貪心策略必須具有無后效性,即當前選擇的結果必須不能對之前的結果狀態產生影響,而只與當前狀態有關。
二.貪心算法思想
- 建立數學模型來描述問題。
- 把求解問題分成若干個子問題。
- 對每一子問題求解,得到子問題的局部最優解。
- 把子問題的局部最優解合成原來解問題的一個解。
三. 貪心算法與動態規划區別
- 背景介紹:這兩種算法都是選擇性算法,就是從一個候選集合中選擇適當的元素加入解集合。
貪心算法的選擇策略即貪心選擇策略,通過對候選解按照一定的規則進行排序,然后就可以按照這個排好的順序進行選擇了,選擇過程中僅需確定當前元素是否要選取,與后面的元素是什么沒有關系。
動態規划的選擇策略是試探性的,每一步要試探所有的可行解並將結果保存起來,最后通過回溯的方法確定最優解,其試探策略稱為決策過程。
2.主要不同:兩種算法的應用背景很相近,針對具體問題,有兩個性質是與算法選擇直接相關的,最優子結構性質和貪心選擇性質。
最優子結構性質是選擇類最優解都具有的性質,即全優一定包含局優。
當時我們也提到了貪心選擇性質,滿足貪心選擇性質的問題可用貪心算法解決,不滿足貪心選擇性質的問題只能用動態規划解決。可見能用貪心算法解決的問題理論上都可以利用動態規划解決,而一旦證明貪心選擇性質,用貪心算法解決問題比動態規划具有更低的時間復雜度和空間復雜度。
四.貪心算法例題
給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最后一個位置。
示例 1:
輸入: [2,3,1,1,4]
輸出: true
解釋: 從位置 0 到 1 跳 1 步, 然后跳 3 步到達最后一個位置。
示例 2:
輸入: [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最后一個位置。
/*使用貪心算法 *1.假如能到達最后一步,則只考慮局部到達最后一步的算法 *2.將目標target定為最后一步,依次往前判斷是否有元素能跳到最后一步 *3.取最靠近能到達target的元素,將其定為target,重復2. *4.最終判斷target能否是第一個元素,如果是則true,否則false。 */ class Solution { public boolean canJump(int[] nums) { if(nums.length==1) { return true; } int number=nums.length-1; boolean temp=false; int distance=-1; while(number>=0) { temp=false; for(int i=number-1;i>=0;i--) { if(nums[i]>=(number-i)) { number=i; temp=true; break; }else { distance=i; } } if(distance==0||number==0) { break; } } return temp; } }