您的位置:首页 > 其它

LintCode-最大子数组

2016-04-06 17:16 537 查看
题目描述:

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

注意事项

  子数组最少包含一个数

样例

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


挑战

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

开始的解法:

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

public class Solution {
/**
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
public int maxSubArray(int[] nums) {
int max = nums[0];
int index = 1;

while(index <= nums.length){
for(int i=0;i<=nums.length-index;i++){
int sum = 0;
for(int j=0;j<index;j++){
sum += nums[i+j];
}

if(sum > max){
max = sum;
}
}
index++;
}
return max;
}
}


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

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

public class Solution {
/**
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
public int maxSubArray(int[] nums) {
int max = nums[0];
int sum = nums[0];

for(int i=1;i<nums.length;i++){

if(sum < 0){
sum = nums[i];
}else{
sum += nums[i];
}

if(sum > max){
max = sum;
}
}
return max;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: