《Java算法》Java貪心算法


貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。

貪心算法的經典案例:

跳躍游戲:

給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達數組的最后一個位置。

例如:[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
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM