码迷,mamicode.com
首页 > 编程语言 > 详细

LintCode刷题---最大子数组

时间:2019-06-02 15:28:39      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:计算   刷题   ret   相加   bar   子串   tco   for   二层   

描述:

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

 

样例:

  输入: [-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刷题---最大子数组

标签:计算   刷题   ret   相加   bar   子串   tco   for   二层   

原文地址:https://www.cnblogs.com/S-Evildoer/p/10962947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!