首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript算法问题:从一个数组中找到和最大的邻接子数组

找到和最大的邻接子数组(也称为最大子数组和问题)是一个经典的算法问题,通常使用 Kadane's Algorithm 来解决。这个算法的时间复杂度是 O(n),非常高效。

以下是 Kadane's Algorithm 的实现步骤:

  1. 初始化两个变量:maxSoFarmaxEndingHere,都设置为数组的第一个元素。
  2. 遍历数组,从第二个元素开始。
  3. 对于每个元素,更新 maxEndingHere 为当前元素和 maxEndingHere + 当前元素 中的较大值。
  4. 更新 maxSoFarmaxSoFarmaxEndingHere 中的较大值。
  5. 最后,maxSoFar 就是和最大的邻接子数组的和。

JavaScript 实现

代码语言:javascript
复制
function maxSubArray(nums) {
    if (nums.length === 0) return 0;

    let maxSoFar = nums[0];
    let maxEndingHere = nums[0];

    for (let i = 1; i < nums.length; i++) {
        maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
        maxSoFar = Math.max(maxSoFar, maxEndingHere);
    }

    return maxSoFar;
}

// 示例
const nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
console.log(maxSubArray(nums)); // 输出: 6

解释

  1. 初始化
    • maxSoFarmaxEndingHere 都初始化为数组的第一个元素。
  2. 遍历数组
    • 从数组的第二个元素开始遍历。
    • 对于每个元素,计算 maxEndingHere,它是当前元素和 maxEndingHere + 当前元素 中的较大值。这一步决定了是否将当前元素加入到之前的子数组中,还是从当前元素重新开始一个新的子数组。
    • 更新 maxSoFar,它是 maxSoFarmaxEndingHere 中的较大值。这一步记录了迄今为止找到的最大子数组和。
  3. 返回结果
    • 最后,maxSoFar 就是和最大的邻接子数组的和。

示例解释

对于数组 [-2, 1, -3, 4, -1, 2, 1, -5, 4]

  • 初始化:maxSoFar = -2, maxEndingHere = -2
  • 第一步:maxEndingHere = max(1, -2 + 1) = 1, maxSoFar = max(-2, 1) = 1
  • 第二步:maxEndingHere = max(-3, 1 - 3) = -2, maxSoFar = max(1, -2) = 1
  • 第三步:maxEndingHere = max(4, -2 + 4) = 4, maxSoFar = max(1, 4) = 4
  • 第四步:maxEndingHere = max(-1, 4 - 1) = 3, maxSoFar = max(4, 3) = 4
  • 第五步:maxEndingHere = max(2, 3 + 2) = 5, maxSoFar = max(4, 5) = 5
  • 第六步:maxEndingHere = max(1, 5 + 1) = 6, maxSoFar = max(5, 6) = 6
  • 第七步:maxEndingHere = max(-5, 6 - 5) = 1, maxSoFar = max(6, 1) = 6
  • 第八步:maxEndingHere = max(4, 1 + 4) = 5, maxSoFar = max(6, 5) = 6

最终结果是 6,对应的子数组是 [4, -1, 2, 1]

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【JavaScript 算法】滑动窗口:处理子数组问题

滑动窗口(Sliding Window)是一种高效解决数组或字符串中子数组(子串)问题的算法技巧。它通过在数组上维护一个窗口(区间),动态地调整窗口的大小和位置,从而高效地解决问题。...本文将详细介绍滑动窗口算法的原理、实现及其应用。 一、算法原理 滑动窗口算法通过在数组上维护一个窗口来解决子数组问题。窗口的大小和位置可以动态调整,以满足不同问题的需求。...重复步骤2-4,直到遍历完整个数组。 二、算法实现 示例问题1:最长无重复字符子串 给定一个字符串,找出其中不含有重复字符的最长子串的长度。...2:长度最小的子数组 给定一个含有正整数的数组和一个正整数 target,找出该数组中满足其和大于等于 target 的长度最小的子数组,并返回其长度。...四、总结 滑动窗口算法是一种高效解决数组或字符串中子数组(子串)问题的算法技巧,通过动态调整窗口的大小和位置,可以在O(n)时间复杂度内解决许多实际问题。

14310
  • 一文看懂《子数组的最大乘积问题》

    问题描述:给定一个长度为 N 的整数数组,只允许乘法,不能用除法。计算任意 N - 1 个数的组合中乘积最大的一组,并写出算法的时间复杂度。...这道题目和另外一个《连续数组的最大乘积》有点像,那道题我们可以通过记录全局最大值和负数最小值来完成。这道题则稍微有点不同,我们来看一下。...我们假设被排除的 元素索引为 i(0 <= i < N, 且 i 为整数)。 我们用两个数组 l 和 r 分别记录从前和从后的子数组乘积。...由于只需要 从有到尾和从尾部到头扫描数组两次即可得到数组l和r,进而可以在线性的时间复杂度获取到所有的乘积,然后在这个过程中我们就可以取出最大值,因此这样做的时间复杂度为O(N)。...总结 子数组乘积问题有很多变种问题,今天我们讲的就是其中一中类型, 我们先通过朴素的解法,然后一步步分析问题的本质,通过空间换时间的解法 进一步减少了时间复杂度。

    1.4K10

    和可被k整除的子数组问题

    . - 力扣(LeetCode) 二·思路: 思路:前缀和第二种表示方式即循环列出方式+同余定理+取模修正: 还是通过循环把它分为由0到i的位置一次由i位置往前走去组合,即可以得到所有的情况,因此要判断...x%k=0即转化为(sum-前缀和)%k成立即可 即由同余定理——> 满足sum%k=前缀和%k 通俗一点也就是通过for循环每次遍历前缀和(sumi之前的sum)都放入了hash,当遍历到i位置,只需要判断...hash中是否对应sum%k下标是否存在值即可 注意:存在负数和0,不能用滑动窗口。...那么对应的就是前缀和为0,即若它是,则此时hash【0】必然有数即初始化为1; for(auto a:nums){ sum+=a;...int remainder=(sum%k+k)%k;//这里进行了修正处理原因是如果余数出现负数,则可能会有情况不符合如:【-1,2,9】,k=2这里 //2是一个子数组,但是

    2400

    【左神算法课】子数组最大差值小于某阈值,求满足条件的子数组个数

    解法思路:    本题其实是滑动窗口的变形。...主体思路为:   1.从第一个元素开始依次向后遍历,同时维护两个窗口(由于要同时操作窗口的头部和尾部,故采用双端队列):       最大值窗口(递减),头部永远存最大值       最小值窗口(递增)...,头部永远存最小值   2.比较两个窗口的头部元素差值,若差值大于阈值,即可跳出内循环。   ...空间复杂度:O(n),这里利用两个滑动窗口分别保存最大值和最小值。...// printArray(arr); 98 cout << getNum(arr, num) << endl; 99 return 0; 100 } 1 //Java版,左神给的代码

    73320

    数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...简介:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...该算法的实现思路如下: 使用一个变量ans存储最终的答案,使用一个变量cur存储当前的连续子数组和。 遍历整个数组,对于每一个数字,更新cur为它自身和(cur + nums[i])之间的较大值。...遍历完数组后,返回ans作为最大子数组和。...,维护了两个变量ans和cur,其中ans表示目前找到的最优连续子序列的和,cur是num[i]为结尾的连续子数组的和。

    4710

    【数据结构和算法】子数组最大平均数 I

    一、题目描述 原题链接:力扣 643 题 子数组最大平均数 I 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。...2.1 滑动窗口含义 滑动窗口算法是一种在数组或列表中寻找特定元素的强大工具,可以高效地解决一系列问题。 例如找到一个数组中最大的K个元素、在一个数组中查找子数组的数量等等。...下面将详细介绍滑动窗口算法的工作原理和应用场景: 工作原理: 窗口大小:滑动窗口算法通过设定一个窗口的大小来解决问题。窗口通常是一个连续的子数组或子字符串。...更新解:根据窗口的移动和调整,更新问题的解,并记录或返回所需的结果。 应用场景: 最小/最大子数组/子字符串:寻找给定数组或字符串中满足特定条件的最小或最大的子数组或子字符串。...字符串匹配:在一个字符串中寻找另一个字符串的出现或满足特定条件的子串。 滑动窗口和哈希表结合:通过使用哈希表来优化滑动窗口算法,提高效率。 优化窗口大小:根据问题的特性,调整窗口大小以寻找最佳解。

    13310

    求一个数组中子数组的最大和算法(Java实现)

    原题及解答     来自《小技巧求一个数组中子数组的最大和》;     题目:     输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。...求所有子数组的和的最大值。要求时间复杂度为 O(n)。...例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4,7, 2, 因此输出为该子数组的和 18。  ...解答:  【只有子数组“前半部分”的和为正数时,子数组的求和才有可能最大】,在这个trick条件下,只需要遍历一次数组就可以。算法是:当从头开始遍历的元素的求和为正数时,继续向后遍历。...当全为正数时,最大的和自然就是所有元素的和,当全为负数时,最大和自然就是其中最大的那个负数的值。通过此算法都能得到相应的结果。

    1.6K80

    Python算法与数据结构--求所有子数组的和的最大值

    题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。...但是为了找子序列的最大和,在遇到相加为负数的情况要跳过,这块注意代码中最后一个if的注释。...基本思路:一个数一个数相加,相加后和最大数以及当前这个数对比,找出最大的;如果相加后是负数,则累加清零 代码----------- # -*- coding: utf-8 -*- """ 题目:输入一个整形数组...数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。...基本思路:一个数一个数相加,相加后和最大数以及当前这个数对比,找出最大的;如果相加后是负数,则累加清零 """ if __name__ == "__main__": #初始化数组,测试数据

    1.8K20

    给定一个数组,求子数组的最大异或和

    直接说这道题时间复杂度O(n)的做法,构建前缀树。....、0-i-1的异或结果全部装在前缀树中,那么以i结尾的最大异或和就是0到某一位置x的异或结果和i异或结果最大,举个例子,假设x是3,0-3的异或结果和i进行异或得到的结果最大,那么就说明4-i的异或结果是最大的...但是如何知道x到底是多少,换句话说,0-x中哪个值和i进行异或得到的结果最大。...其实这个也比较好想,假设i是0100(最高位0是符号位),只需要沿着前缀树找到0011,异或出来的结果就是0111,一定就是最大的,如果不能刚好找到合适的,那就有什么选什么,只要保证从最高位开始往下每次的决策是最优的就行...best : (best ^ 1);//实际要选的路(如果没有期待选的路) res |= (path ^ best) 的每一位

    1.6K10

    每日算法系列【LeetCode 1031】两个非重叠子数组的最大和

    题目描述 给出非负整数数组 A ,返回两个非重叠(连续)子数组中元素的最大和,子数组的长度分别为 L 和 M。(这里需要澄清的是,长为 L 的子数组可以出现在长为 M 的子数组之前或之后。)...提示 L >= 1 M >= 1 L + M <= A.length <= 1000 0 <= A[i] <= 1000 题解 这题意思就是找到两段给定长度的、不重合的、连续的区间,使得两段区间和最大。...那有没有更快的方法呢?试试动态规划!因为两段区间有前后顺序,我们不妨假设长度为 L 的区间在后面。用 dpm[i] 表示前 i 个数中长度为 M 的区间和的最大值。...然后 dpm 全部处理完之后,遍历数组,假设长度为 L 的区间以 A[i] 结束,那么我们只需要在 A[0] 到 A[i-L] 中间找长度为 M 的区间最大和就行了,那答案不就是上面求好的 dpm[i-L...这样就等于用了两个指针,分别指向了两个区间的右端点,总共最多移动 2n 次就行了。

    1.1K20

    算法简单题,吾辈重拳出击 - 连续子数组的最大和

    连续子数组的最大和 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。...示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。...这题的基础算法思维是:动态规划(Dynamic programming,简称DP) 老观众都知道之前在讲狄克斯特拉最短路径问题有提过这个,有兴趣去专栏翻一翻。...DP的操作过程,一言以蔽之:大事化小,小事化了。 即将一个大问题转化成几个小问题;求解小问题;推出大问题的解。 解: 1、题目要求的是给出连续最大子数组和是多少,而没有要求给出连续最大子数组是哪一个。...3、接着,最关键的是,怎么理解“连续最大”。“连续最大数组的特点是什么?”答案是: 连续最大的数组的最后一位肯定是一个正数,要不然还把它纳入进来干嘛? 然后,这个正数前面的几个数字之和也要是正数!

    24310

    《剑指Offer》- 连续子数组的最大和或最小和

    前言 本文是《剑指Offer》系列(JavaScript版)的第一篇,题目是“连续子数组的最大和或最小和”。 话不多说,开始“打怪”修炼......一、理解题目 以“连续子数组的最大和”为例,相当于我们在数组中,计算连续的子数组的和,找寻最大值。...求连续子数组组合方案: 将数组中的元素进行连续子数组的组合,每一种组合计算出一个值,依次比较后取出最大值。那这种方式是可以肯定是可以最终的效果的,But这么处理的话,会有多少种组合方案呢?...初始化两个变量:sum(连续子数组的累加和)、max(最大值) 2....连续子数组的最小和 “连续子数组的最小和” 这个需求的实现原理和“连续子数组的最大和”的实现基本是一致的,唯一的区别点为:当sum的值 > 0为正数时,累加就无意义了,需要重新赋值为当前值。

    88420
    领券