【刷算法】连续子数组的最大和

简介: 【刷算法】连续子数组的最大和

题目描述


HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)


分析


首先如果数组里面全是小于0的负数,那么连续数组的最大和就是那个最大的负数

如果里面有正数还有负数,那么从左开始累加,如果遇到累加和小于0,则说明这一段数组不会是构成最大和的连续子数组,道理很简单,如果构成最大和的连续子数组中包含这么一段累加和为负数的子数组,那么去掉它们之后和不就更大了么?所以不会包含。

需要两个变量max和cur,cur记录当前的累积和,小于0立马开始从0计算,max记录遍历过程中出现过的累积和中的最大值。


代码实现


function FindGreatestSumOfSubArray(arr)
{
    if(arr.length === 0)
        return;
    if(arr.length === 1)
        return arr[0];
    var allNeg = true;
    var negMax = -Infinity;
    for(var i = 0;i < arr.length;i++) {
        if(arr[i] > negMax){
            negMax = arr[i];
        }
        if(arr[i] >= 0){
            allNeg = false;
        }
    }
    if(allNeg)
        return negMax;
    var max = -Infinity, cur = 0;
    for(var i = 0;i < arr.length;i++) {
        cur += arr[i];
        max = Math.max(max, cur);
        cur = cur >=0 ? cur : 0;
    }
    return max;
}



相关文章
【剑指offer】-连续子数组的最大和-30/67
【剑指offer】-连续子数组的最大和-30/67
剑指offer 43. 连续子数组的最大和
剑指offer 43. 连续子数组的最大和
73 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)
需要怎么分割序列才是个问题,题目其实给了提示因为序列里的数只能是[0, n-1]所以选择[l, r] 连续的序列中的数一定是 [l, r] 这段区间的数字,所以我们只需要遍历数组,去找这段区间内最大的数字,即边界值r,因为他才是决定边界的数字,每次我们到达了r这个位置就表示下一段区间。
66 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)
刷爆力扣之最短无序连续子数组
刷爆力扣之最短无序连续子数组
刷爆力扣之最长连续递增序列
刷爆力扣之最长连续递增序列
|
算法
【刷算法】把数组排成最小的数
【刷算法】把数组排成最小的数
|
算法
【刷算法】旋转数组的最小数字
【刷算法】旋转数组的最小数字
【刷穿 LeetCode】最短无序连续子数组 :「双指针 + 排序」&「双指针 + 线性扫描」| 8月更文挑战
【刷穿 LeetCode】最短无序连续子数组 :「双指针 + 排序」&「双指针 + 线性扫描」| 8月更文挑战