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,也可以求解此题。

扫描二维码关注公众号,回复: 11346747 查看本文章

思路:

我们先找到动态转移方程:

读题目我们可以写出如下动态转移方程

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方程,理解动态规划的思想,这两个算法是·经点算法,希望大家都可以掌握!

猜你喜欢

转载自blog.csdn.net/qq_43431171/article/details/105899037