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 算法题:从一个数组中找出总和最大的连续子数组的主要内容,如果未能解决你的问题,请参考以下文章