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] 也会找到最大的一个负数,.   

猜你喜欢

转载自www.cnblogs.com/S-Evildoer/p/10962947.html