LintCode 402: Continuous Subarray Sum

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;
}
posted @ 2017-02-23 19:58  GenkunAbe  阅读(260)  评论(0编辑  收藏  举报