53. 最大子序和-java貪心算法&動態規劃算法求解

53. 最大子序和

難度簡單1886

給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

進階:

如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。

通過次數215,842

提交次數427,865

思路:

此題可以採用暴力法,但是效率很顯然是o(n*n)。因此並不建議使用。既然題目要求最大子序列和,我們容易想到用貪心算法求解。

代碼:

    public static int maxSubArray2(int[] nums){
        int res = nums[0];
        int sum = 0;
        //定義一個sum,用來計數當前選擇的子數組累加和
        for (int num : nums) {
            if (sum>0){
                sum+=num;
            }else{
                sum=num;
            }
            res=Math.max(res,sum);
        }
        return res;
    }

此外,既然可以用貪心算法求解,我們也可以嘗試一下動態規劃dp,也可以求解此題。

思路:

我們先找到動態轉移方程:

讀題目我們可以寫出如下動態轉移方程

dp[i] = Math.max(dp[i-1],0)+nums[i];

代碼:

    public static int maxSubArray(int[] nums) {
        int len = nums.length;
        if (len==1){
            return nums[0];
        }
        int [] dp=new int[len];

        dp[0] = nums[0];

        int max=nums[0];

        for (int i = 1; i < len; i++) {
            dp[i] = Math.max(dp[i-1],0)+nums[i];

            if (dp[i]>max){
                max = dp[i];
            }
        }
        return max;
    }

小結博主建議大家要嘗試自己動手推到一下dp方程,理解動態規劃的思想,這兩個算法是·經點算法,希望大家都可以掌握!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章