您的位置:首页 > 其它

LintCode 402: Continuous Subarray Sum

2017-02-23 19:58 381 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: