LintCode-最大子数组

题目描述:

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

注意事项

  子数组最少包含一个数

样例

  给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6

挑战

  要求时间复杂度为O(n)

开始的解法:

暴力破解,从长度为1的子数组开始查找,计算每个子数组的和,找出最大的。

 1 public class Solution {
 2     /**
 3      * @param nums: A list of integers
 4      * @return: A integer indicate the sum of max subarray
 5      */
 6     public int maxSubArray(int[] nums) {
 7         int max = nums[0];
 8         int index = 1;
 9         
10         while(index <= nums.length){
11             for(int i=0;i<=nums.length-index;i++){
12                 int sum = 0;
13                 for(int j=0;j<index;j++){
14                     sum += nums[i+j];
15                 }
16                 
17                 if(sum > max){
18                     max = sum;
19                 }
20             }
21             index++;
22         }
23         return max;
24     }
25 }

但是面对大数据量的时候会超时。

第二种解法,复杂度为O(n),因为是求连续的子数组的和,所以当当前的和为负数时,再加到下一个元素上肯定会减小整体的和,所以把当前和sum直接职位下一个元素,max永远记录最大的sum值。代码如下:

 1 public class Solution {
 2     /**
 3      * @param nums: A list of integers
 4      * @return: A integer indicate the sum of max subarray
 5      */
 6     public int maxSubArray(int[] nums) {
 7         int max = nums[0];
 8         int sum = nums[0];
 9         
10         for(int i=1;i<nums.length;i++){
11            
12             if(sum < 0){
13                 sum = nums[i];
14             }else{
15                 sum += nums[i];
16             }
17             
18             if(sum > max){
19                 max = sum;
20             }
21         }
22         return max;
23     }
24 }
原文地址:https://www.cnblogs.com/xiaocainiao2hao/p/5360167.html