貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。
貪心算法的經典案例:
跳躍游戲:
給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達數組的最后一個位置。
例如:[2,3,1,1,4,2,2,1] 很明顯最短路線:2跳到3的位置,再跳到4的位置,然后就可以跳到最后。
算法思路:(綠色圈表示當前位置,橙色表示能夠達到的最遠距離)
從第一個數字2開始,能達到橙色1的位置。能達到的最遠位置變更。
走到綠色3的位置,這個位置能達到的最遠位置變成橙色4的位置,最遠位置變更,步數加一。
繼續走到綠色1的位置,這個位置能達到的最遠位置不如橙色4的位置,最遠位置沒有變化,步數不變。
繼續走到綠色1的位置,這個位置能達到的最遠位置不如橙色4的位置,最遠位置沒有變化,步數不變。
繼續走到綠色4的位置,這個位置能達到的最遠位置為橙色1的位置,最遠位置變化,步數加一,且已經到達終點,循環結束。
該算法:
時間復雜度:O(n)O(n)。
空間復雜度:O(1)O(1)。
代碼如下:
public class Subject92 { public static void main(String[] args) { int[] arrInt = new int[]{2,3,1,1,4,2,1}; System.out.println(new Subject92().jump(arrInt)); } public int jump(int[] nums) { //小於等於1的都不需要跳 int lengths = nums.length; if(lengths <= 1){ return 0; } int reach = 0; //當前能走的最遠距離 int nextreach = nums[0]; int step = 0; //需要步數 for(int i = 0;i<lengths;i++){ //貪心算法核心:這一步是不是可以比上一步得到更多步數,可以則取最新的路線。 nextreach = Math.max(i+nums[i],nextreach); if(nextreach >= lengths-1) return (step+1); if(i == reach){ step++; reach = nextreach; } } return step; } }
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/jump-game-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。