LintCode刷题---最大子数组

Posted s-evildoer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode刷题---最大子数组相关的知识,希望对你有一定的参考价值。

描述:

  给定一个整数数组, 找到一个具有最大和的子数组, 返回其最大和.

 

样例:

  输入: [-2, 2, -3, 4, -1, 2, 1, -5, 3]

  输出:   6

  解释:   符合要求得子数组为[4, -1, 2, 1], 其最大和为6

 

解题:

  难点分析: 注意数组中有三种情况, 全为负数, 全为正数, 有正有负.

        还需要注意得是, 这里得最大子数组是最大连续得子数组, 不是随意组合得最大子数组

 

两种方法解题:

  1. 暴力解题: 两层循环,遍历所有直接找到最大的子数组.

 

public int maxSubArray(int[] nums) 
        // write your code here
        int MaxSum=nums[0];
        for(int i=0;i<nums.length;i++)
            int sum = 0;
            for(int j = i; j<nums.length;j++)
                sum += nums[j];
                if(sum > MaxSum)
                    MaxSum = sum;
                
            
        
        return MaxSum;
    

算法分析:

  先定义最大的子数组和为数组第一个数,  第一层循环就是找最大子数组的开头, 第二层循环找最大子数组的尾.

  第二层循环同时计算子数组的和, 当子数组的和大于MaxSum时, 就修改MaxSum  =  sum;

 

第二种解法:

  分而治之???

  代码确实简单, 时间复杂度为O(n)

public int maxSubArray(int[] nums) 
        // write your code here
        int MaxSum=nums[0];
        int sum = 0;
        for(int i=0;i<nums.length;i++)
            sum += nums[i];
            if(sum > MaxSum)
                MaxSum = sum;
            
            if(sum < 0)
                sum = 0;//子串和为负数, 丢掉
            
        
        return MaxSum;
    

算法分析:

  也是先定义最大子数组和为数组第一个, 一层for循环, 直接计算各项相加的和, 但是, 当各项和为负数时, 直接就掉,

  从后开始重新寻找.即使是全为负数时, sum = 0; sum += nums[i] 也会找到最大的一个负数,.   

以上是关于LintCode刷题---最大子数组的主要内容,如果未能解决你的问题,请参考以下文章

LintCode-最大子数组差

lintcode 最大子数组III

(java刷题--918环形子数组的最大和

[LintCode] Maximum Subarray 最大子数组

java刷题--152乘积最大子数组

lintcode入门篇二