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

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

题目描述


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;
}



相关文章
|
8月前
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
|
算法
【算法专题突破】双指针 - 最大连续1的个数 III(11)
【算法专题突破】双指针 - 最大连续1的个数 III(11)
43 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)
需要怎么分割序列才是个问题,题目其实给了提示因为序列里的数只能是[0, n-1]所以选择[l, r] 连续的序列中的数一定是 [l, r] 这段区间的数字,所以我们只需要遍历数组,去找这段区间内最大的数字,即边界值r,因为他才是决定边界的数字,每次我们到达了r这个位置就表示下一段区间。
79 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)
|
存储
【每日一题Day60】LC1703得到连续 K 个 1 的最少相邻交换次数 | 中位数贪心
局部最优:x位于区间[p[0],p[k−1]]内部时【无论位于哪个位置】,到p[0]和p[k−1]的距离是定值p[k−1]−p[0],因此应使x xx位于所有区间的内部即中位数,使x xx到所有区间的距离为定值,此时能够达到全局最优
108 0
【每日一题Day60】LC1703得到连续 K 个 1 的最少相邻交换次数 | 中位数贪心
|
算法 前端开发
算法简单题,吾辈重拳出击 - 连续子数组的最大和
对算法感到畏惧的 xdm,咱不求一口吃个胖子,先对算法简单题重拳出击,尝试建立自信,训练基础算法思维,不日定能大杀四方、所向披靡。
刷爆力扣之最短无序连续子数组
刷爆力扣之最短无序连续子数组
LeetCode每日一题——769. 最多能完成排序的块
给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。
84 0