![](/img/trans.png)
[英]Elegant way to find contiguous subarray within an array in 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]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.