LintCode 41. 最大子数组
问题描述
给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
注意事项
子数组最少包含一个数
样例
给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6
问题分析
正常思路,暴力查找,对所有的子区间求和比较,找到最大的值。
不完善代码 Time Limit Exceeded
class Solution {
public:
/*
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
int maxSubArray(vector<int> &nums) {
// write your code here
int sum1 = 0,sum2 = 0,max = nums[0];
for (int i = nums.size(); i > 0; i--) {
for (int j = 0; j <= nums.size() - i; j++) {
sum1 = sum2;sum2 = 0;
for (int k = j; k < i + j; k++) {
sum2 += nums[k];
}
max = max > sum2 ? max : sum2;
}
}
return max;
}
};
代码分析
这个代码之所以不完善,就是因为它太暴力了,当数据很多时,在时间复杂度上就超出了本题的范围,出现Time Limit Exceeded提示。
代码改进
class Solution {
public:
/**
* @param nums: A list of integers
* @return: A integer indicate the sum of max subarray
*/
int maxSubArray(vector<int> nums) {
// write your code here
int maxSub=nums[0],accSub=0,size=nums.size();
if(size<=0)
return 0;
for(int i=0; i<size; i++) {
if(accSub < 0)
accSub = nums[i];
else
accSub += nums[i];
if(accSub > maxSub)
maxSub = accSub;
}
return maxSub;
}
};