LintCode 402: Continuous Subarray Sum
题目描述
给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的下标。(如果两个相同的答案,请返回其中任意一个)
样例
给定[-3, 1, 3, -3, 4]
, 返回[1,4]
.
Thu Feb 23 2017
思路
本题有很多解法,最巧妙的解法就是一遍扫描记忆的方法了,时间复杂度为\(O(n)\)。
用一个变量记录连续累加的和,当和为负数时,变量清零,从下一个数字开始累加记录。
在这里只需要注意一下一些小细节,比如如何记录最大子数组的起始位置,以及处理一下数组中所有的数都是负数的情况。
代码
// 连续子数组求和
vector<int> continuousSubarraySum(vector<int>& A)
{
int max_sum = -1, sum = 0, start;
int is_all_negative = 1, max_num = -9e5, max_num_ind = -1
vector<int> ans(2);
for (int i = 0; i < A.size(); ++i)
{
if (sum <= 0) start = i;
sum += A[i];
if (sum < 0) sum = 0;
else if (sum > max_sum)
{
is_all_negative = 0;
max_sum = sum;
ans[0] = start;
ans[1] = i;
}
if (max_num < A[i])
{
max_num = A[i];
max_num_ind = i;
}
}
if (is_all_negative)
{
ans[0] = ans[1] = max_num_ind;
}
return ans;
}