【问题标题】:JavaScript algorithm question: get the find the contiguous subarray which has the largest sum from an arrayJavaScript 算法题:从一个数组中找出总和最大的连续子数组
【发布时间】: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 数组中添加后续项。

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

【问题讨论】:

    标签: javascript algorithm


    【解决方案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); 
          } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-09
        • 2015-07-27
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        • 2021-01-21
        相关资源
        最近更新 更多