JavaScript 算法题:从一个数组中找出总和最大的连续子数组

Posted

技术标签:

【中文标题】JavaScript 算法题:从一个数组中找出总和最大的连续子数组【英文标题】:JavaScript algorithm question: get the find the contiguous subarray which has the largest sum from an array 【发布时间】:2021-04-09 23:34:59 【问题描述】:

问题来源于这个leetcode问题:https://leetcode.com/problems/maximum-subarray/

但不是返回最大的和,而是返回具有最大和的子数组。例如[-2,1,-3,4,-1,2,1,-5,4],最大和为6,如[4,-1,2,1]。这里我想返回[4,-1,2,1]而不是6这个号码。

这是我的尝试:

var maxSubArray = function(nums) 
    let max = -Infinity
    let sum = 0
    const results = []
    for(const num of nums) 
        results.push(num)
        sum += num
        max = Math.max(sum, max)
        if(sum < 0) 
            sum = 0
            results.length = 0
        
    
    
    return results
;

maxSubArray([-2,1,-3,4,-1,2,1,-5,4])

但是它返回一个不正确的答案 - [ 4, -1, 2, 1, -5, 4 ]。我发现很难实现这一点,因为很难确定我们是否应该继续在 results 数组中添加后续项。

想知道是否有人愿意尝试一下。

【问题讨论】:

【参考方案1】:

In this tutorial,通过使用Kadane’s algorithm 并在我们获得最大总和时维护索引。

var maxSubArray = function(nums) 
    var max_so_far = 0, max_ending_here = 0;
    var startIndex = -1;
    var endIndex = -1;
    for(var i = 0; i < nums.length; i++) 
        if (nums[i] > max_ending_here + nums[i]) 
            startIndex = i;
            max_ending_here = nums[i];
         else
            max_ending_here = max_ending_here + nums[i];
 
        if (max_so_far < max_ending_here) 
            max_so_far = max_ending_here;
            endIndex = i;
        
    
    
    return nums.slice(startIndex, endIndex + 1);
;

console.log(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))

谢谢baeldung's blog.

【讨论】:

【参考方案2】:

This page 展示了如何在获得最大总和时维护索引。

没有JS,所以我这里复制Java代码:

 static void maxSubArraySum(int a[], int size) 
     
        int max_so_far = Integer.MIN_VALUE, 
        max_ending_here = 0,start = 0, 
        end = 0, s = 0; 
  
        for (int i = 0; i < size; i++)  
         
            max_ending_here += a[i]; 
  
            if (max_so_far < max_ending_here)  
             
                max_so_far = max_ending_here; 
                start = s; 
                end = i; 
             
  
            if (max_ending_here < 0)  
             
                max_ending_here = 0; 
                s = i + 1; 
             
         
        System.out.println("Maximum contiguous sum is " 
                           + max_so_far); 
        System.out.println("Starting index " + start); 
        System.out.println("Ending index " + end); 
     

【讨论】:

以上是关于JavaScript 算法题:从一个数组中找出总和最大的连续子数组的主要内容,如果未能解决你的问题,请参考以下文章

算法题:两数之和——JavaScript及Java实现

#yyds干货盘点# leetcode算法题:组合总和 II

LeetCode[39]: 组合总和

力扣算法题—064最小路径之和

算法题之找出数组里第K大的数

通过位操作来遍历子集 leetcode题5759