题目描述:
给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
注意事项
子数组最少包含一个数
样例
给出数组[−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 }