簡體   English   中英

JavaScript 算法題:從一個數組中找出總和最大的連續子數組

[英]JavaScript algorithm question: get the find the contiguous subarray which has the largest sum from an array

問題源於這個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數組中添加后續項目。

想知道是否有人願意嘗試一下。

本頁展示了當我們獲得最大總和時如何維護索引。

沒有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); 
    } 

在本教程中,通過使用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 的博客。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM