Maximum Subarray

16 篇文章 0 订阅
8 篇文章 0 订阅

Description:

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

public int maxSubArray(int[] nums){}

问题描述:

给一给数组,找到这个数组的子数组(子数组连续),这个子数组是所有子数组中元素的和最大的,并且这个子数组至少包含一个元素。

Ex:

given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

解法一:

思路:

这个题目我认为在数据很大的时候,人肉是很难找到这样的子数组以及子数组求和的最大值。这个时候肯定是要借助计算机,但是这个问题用什么方法解决呢??
我首先想到是动态规划(因为这个涉及子数组的和原数组的问题)
但是动态规划要知道子问题与状态转移方程:
原问题的子问题maxSubArray(int A[], int i) ,代表A[0:i ] 的最大子数组的和, A[i] 作为最后一个元素。我们要解决的问题是A[0: A.length-1]的最大子数组的和。

状态转移方程

maxSubArray(A, i) = maxSubArray(A, i - 1) > 0 ? maxSubArray(A, i - 1) : 0 + A[i]; 

从状态转移方程可以看到,如果maxSubArray(A, i - 1)小于0了,那么加上去肯定不会增大,所以用0代替(即这段子数组不要了)

Code:

public int maxSubArray(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        //dp[i] means the maximum subarray ending with A[i];
        dp[0] = nums[0];
        int max = dp[0];

        for(int i = 1; i < n; i++){
            dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
            max = Math.max(max, dp[i]);
        }

        return max;
    }

解法二:

思路:

由于该问题最后只需要找到这样的子数组中的所有元素求和后的值,那么就不需要开这么多空间,只需要sum和max两个记录变量就行了,空间复杂度降到O(1)。
动态规划的思路还是如上。

Code:

public int maxSubArray(int[] nums) {
        if(nums == null || nums.length == 0) {return 0;}
        int max = nums[0] , sum = nums[0];
        for(int i = 1; i < nums.length; i++){
            if(sum < 0) { sum = nums[i];}
            else {sum += nums[i];}

            max = Math.max(max,sum);
        }

        return max;
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值