LeetCode刷題之貪心算法

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

貪心算法不是對所有問題都能得到整體最優(yōu)解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無后效性,即某個狀態(tài)以前的過程不會影響以后的狀態(tài),只與當前狀態(tài)有關。

貪心算法基本思路
  • 建立數(shù)學模型來描述問題
  • 把求解的問題分成若干個子問題
  • 對每個子問題求解,得到子問題的局部最優(yōu)解
  • 把子問題的解局部最優(yōu)解合成原來問題的一個解

各題題解:

//            ###### [買賣股票的最佳時機](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)
    public int maxProfit(int[] prices) {
        //思路:遍歷一遍,記錄一個最小值,如果當前不是最小值,那么與最小值做差,假定在這天賣,記錄一個最大利潤
        int minPrice = prices[0];
        int maxProfit = 0;
        for (int i=1;i<prices.length;i++) {
            if (prices[i] < minPrice) {
                minPrice = prices[i];
            } else {
                //那么假如在這天賣,記錄當前的差價
                maxProfit = Math.max(prices[i]-minPrice, maxProfit);
            }
        }
        return maxProfit;
    }

//            ###### [買賣股票的最佳時機 II](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/)
    /**
     * 只要有漲幅區(qū)間,都要吃掉股價漲幅
     */
    public int maxProfit2(int[] prices) {
        int profit = 0;
        for(int i=prices.length-1;i>0;i--) {
            int dif = prices[i] - prices[i-1];
            if(dif > 0) {
                //只要后一天股價比前一天高,都要累計收益
                profit += dif;
            }
        }
        return profit;
    }

    //            ###### [跳躍游戲](https://leetcode.cn/problems/jump-game/)

    /**
     * 思路:貪心算法
     * 只要存在一個位置x,它本身可以到達,并且它跳躍的最大長度為 x+nums[x],這個值大于等于y,即 x+nums[x]≥y,那么位置 y 也可以到達。
     * 這樣以來,我們依次遍歷數(shù)組中的每一個位置,并實時維護 最遠可以到達的位置,如果 最遠可以到達的位置 大于等于數(shù)組中的最后一個位置,就return true
     */
    public boolean canJump(int[] nums) {
        int n= nums.length;
        int rightmost = 0; //定義當次跳躍范圍能走的最遠位置
        for (int i=0;i<n;i++) {
            if (i<=rightmost) {
                //在當次遍歷的最遠范圍內(nèi)查找,看i位置能走的最遠位置i+nums[i]能否刷新rightmost
                rightmost = Math.max(rightmost, i+nums[i]);
                if (rightmost >= n-1) {
                    return true;
                }
            }
        }
        return false;
    }

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • [toc] LeetCode.1 兩數(shù)之和 給定一個整數(shù)數(shù)組 nums 和一個目標值 target,請你在該數(shù)組中...
    tylorsenna閱讀 228評論 0 0
  • 根據(jù)身高重建隊列 假設有打亂順序的一群人站成一個隊列。 每個人由一個整數(shù)對(h, k)表示,其中h是這個人的身高,...
    我是小曼巴閱讀 335評論 0 0
  • 貪心算法,又稱貪婪算法。 1、在對問題求解時,總是做出在當前看來最好的選擇。即貪心算法不從整體最優(yōu)上加以考慮。 2...
    李威威閱讀 1,039評論 0 1
  • (Since 2020.10.14-2021.3.10) LeetCode刷題筆記,共兩百多題,記錄整理如下: 動...
    周恩國的學習筆記閱讀 906評論 0 1
  • 夜鶯2517閱讀 128,201評論 1 9

友情鏈接更多精彩內(nèi)容