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刷题---最大子数组的主要内容,如果未能解决你的问题,请参考以下文章