首页
学习
活动
专区
工具
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)时间复杂度内解决许多实际问题

10710
  • 一文看懂《数组最大乘积问题

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

    1.4K10

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

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

    72820

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

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

    12910

    求一数组中子数组最大算法(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

    每日算法系列【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)做法,构建前缀树。....、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) << move;//设置答案每一位

    1.6K10

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

    连续数组最大和 输入一整型数组数组或连续多个整数组成一数组。求所有数组最大值。 要求时间复杂度为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、接着,最关键是,怎么理解“连续最大”。“连续最大数组特点是什么?”答案是: 连续最大数组最后一位肯定是一正数,要不然还把它纳入进来干嘛? 然后,这个正数前面的几个数字之和也要是正数!

    23910

    前端算法专栏-数组-215. 数组第K最大元素

    我是程序员库里,今天新开一前端算法专栏。接下来会分类给大家分享常考算法题目。很多朋友也是看着这套系列算法拿到很多offer!所以也是想分享给更多朋友,帮助到有需要朋友。...分类数组-三路快排题目215. 数组第K最大元素给定整数数组 nums 整数 k,请返回数组中第 k 最大元素。...请注意,你需要找数组排序后第 k 最大元素,而不是第 k 不同元素。你必须设计并实现时间复杂度为 O(n) 算法解决此问题。...定义变量max,初始值是数组第一项,表示默认当前第一最大定义变量index,初始值0,表示当前数组最大索引在内循环从第2值开始遍历,比较max当前遍历值如果max小于当前遍历值,...就把当前值赋值给max,同时将当前值索引赋值给index遍历完第一次后,max表示当前最大元素,然后把当前最大值从数组中删除继续从外层循环遍历,重复上述操作遍历k次后,将当前第k大值赋值给max

    19410

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

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

    87920

    力扣 (LeetCode)-最大子序,JavaScript数据结构与算法数组

    )-合并两有序链表,删除排序数组重复项,JavaScript笔记|刷题打卡-3月2日 前言 如果这篇文章有帮助到你,给❤️关注,❤️点赞,❤️鼓励一下作者,接收好挑战了吗?...(数组结构算法会用到方法) concat,连接2或更多数组,并返回结果 every,对数组每一项运行给定函数,如果该函数对每一项都返回true,则返回true filter,对数组每一项运行给定函数...这个方法没有返回值 join,将所有的数组元素连接成一字符串 indexof,返回第一与给定参数相等数组元素索引,没有找到则返回-1 lastIndexOf,返回在数组中搜索到与给定参数相等元素索引里最大值...最大子序 一、题目描述 给定一整数数组 nums ,找到一具有最大连续数组数组最少包含一元素),返回其最大和。...示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续数组 [4,-1,2,1] 最大,为 6 。

    46140
    领券