Leetcode 53:最大子序和 Java实现

问题描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:动态规划
这是一道动态规划的经典题目。
动态规划方程为:nums[i] = max(nums[i], nums[i-1]+nums[i]);
过程如下:
Leetcode 53:最大子序和 Java实现_第1张图片
重复上述步骤,最后得到的数组就是到每个元素为止的最大子序列和,最后找出该数组中的最大值就是题目要求的最大子序列和。

public int maxSubArray(int[] nums) {

        int max = nums[0];

        for (int i = 1; i < nums.length; i++) {
            nums[i] = Math.max(nums[i], nums[i-1]+nums[i]);
            if (nums[i] > max) {
                max = nums[i];
            }
        }
        return max;
    }

解法二:分治法
因为我对分治法不太熟悉,所以可能逻辑比较乱。。
将数组从中间分成左(l ~ mid)、右(mid+1 ~ r)、中间元素(mid)三部分,然后对左边部分求最大子序列和,对右边部分求最大子序列和,还有就是包括中间元素在内的横跨左右的最大子序列和,再求出这三者里的最大值就是我们所要求的值。

public int maxSubArray(int[] nums) {
        return max(nums, 0, nums.length-1);
    }

    public static int max(int[] nums, int l, int r) {
        // l=r的时候就是只有一个元素直接返回
        if (l == r) {
            return nums[l];
        }

        //取中间元素
        int mid = (l+r)/2;
        //递归调用求出左边子序列和最大值
        int lMax = max(nums, l, mid);
        //递归调用求出右边子序列和最大值
        int rMax = max(nums, mid+1, r);

        //求包含中间元素在内横跨左右数组的子序列和
        //求左边包含中间元素在内的子序列和最大值
        int lCrossMax = Integer.MIN_VALUE;
        int lCrossSum = 0;
        for (int i = mid; i >= l; i--) {
            lCrossSum += nums[i];
            lCrossMax = Math.max(lCrossSum, lCrossMax);
        }

        //求右边包含中间元素在内的子序列和最大值
        int rCrossMax = Integer.MIN_VALUE;
        int rCrossSum = 0;
        for (int i = mid+1; i <= r; i++) {
            rCrossSum += nums[i];
            rCrossMax = Math.max(rCrossSum, rCrossMax);
        }

        //包括中间元素在内的横跨左右的最大子序列和
        int crossMax = lCrossMax + rCrossMax;

        //将crossMax,lMax,rMax中的最大值返回,则就是我们要的值
        return Math.max(crossMax, Math.max(lMax, rMax));
    }

如果觉得我的解法不错的话,可以到我的github上给一个star吗?谢谢~
https://github.com/zzdreamz/Leetcode-practice

你可能感兴趣的:(Leetcode)