Java 从包含最大和的整数数组中提取子数组的算法
有一个整数数组(正整数和负整数)。请给出一个算法,该算法将为您提供最大和的子数组。 例如: 那么答案应该是Java 从包含最大和的整数数组中提取子数组的算法,java,javascript,c++,c,algorithm,Java,Javascript,C++,C,Algorithm,有一个整数数组(正整数和负整数)。请给出一个算法,该算法将为您提供最大和的子数组。 例如: 那么答案应该是{4,5,7,8,13}as4+5+7+8+13=37 我无法设计此问题的算法。以下是此问题的线性解决方案: var a = [2,3,-1,4,5,7,8,13,-20]; var positiveNums = a.filter(function(num){ return num > 0 }); // [2,3,4,5,7,8,13] var sum = positiveNum
{4,5,7,8,13}
as4+5+7+8+13=37
我无法设计此问题的算法。以下是此问题的线性解决方案:
var a = [2,3,-1,4,5,7,8,13,-20];
var positiveNums = a.filter(function(num){
return num > 0
}); // [2,3,4,5,7,8,13]
var sum = positiveNums.reduce(function(a, b){
return a+b;
}); // 42
long getMaximumSubarraySum(int[] a) {
int start = 0;
int end = 0;
long result = 0; // I assume that an empty subarray is allowed.
long minPrefixSum = 0;
int minPrefixSumPos = -1;
long currentPrefixSum = 0;
for (int i = 0; i < a.length; i++) {
currentPrefixSum += a[i];
if (currentPrefixSum - minPrefixSum > result) {
result = currentPrefixSum - minPrefixSum;
start = minPrefixSumPos + 1;
end = i + 1;
}
if (currentPrefixSum < minPrefixSum) {
minPrefixSum = currentPrefixSum;
minPrefixSumPos = i;
}
}
// The resulting subarray is [start; end).
return result;
}
long getMaximumSubraySum(int[]a){
int start=0;
int end=0;
long result=0;//我假设允许使用空子数组。
long minPrefixSum=0;
int minPrefixSumPos=-1;
长currentPrefixSum=0;
for(int i=0;iresult){
结果=currentPrefixSum-minPrefixSum;
start=minPrefixSumPos+1;
结束=i+1;
}
if(currentPrefixSum
这个算法背后的思想很简单:让我们来看看前缀和,然后答案是最大值<代码> max(PrimoSuth[i] -PrimoSuth[j]),其中
j
代表所有i
。这正是这段代码的作用:它迭代输入数组,保持当前前缀和最小前缀和,并选择最佳答案。几个月前,我已经解决了这个问题,所以我将向您提供算法。由您编写程序。
该程序的要点是,当你在数组中遇到负数时,求和会减少。因此,当这种情况发生时,你将数组分成3部分。
1)至今求和
2)至今求和+负数值(或如果有连续负数,则为值)
3)(2)+求和直到遇到另一个负数
给定这3个部分,选择具有最大值的部分并将其存储在变量中。此值成为下一次迭代的(1)。继续,直到到达数组末尾
下面是伪代码:
do until end of array{
b=compute_b() //Compute sum till you encounter negetive number
c=compute_c() //Compute sum till you encounter a positive number
a=max+b+c;
if(a>c)
{
if(a>max)
{
max=a;
}
}
else
{
if(c>max)
{
max=c;
}
}
}
print max
您是否试图从一定数量的数字中进行子集?如果没有额外的约束,这很简单。只需添加数组的所有正元素。如果没有正元素,则总和为0(空子集)或单个最大元素(1元素子集),具体取决于需求。但在这种情况下,不清楚为什么{2,3}从结果中排除。也许你的意思是有序数组的子序列?Jarlax:Assum of{2,3}是5。但是{4,5,7,8,13}的和是37和37>5。@PraveenKumar如果
a
被设置,{2,3,4,5,7,8,13}是最大和为42的有效子集。@PraveenKumar那么它是小注释。问题是如何检索子数组本身,而不是求和。此外,您的代码允许零长度子数组(这可能是可接受的,也可能是不可接受的)@Jarlax我修改了代码,这样它也可以找到子数组本身。零长度的子数组在这里看起来很自然,因为否则问题是:如果A
为空,我们该怎么办?谢谢@Jarlax,因为我不知道最大子数组问题。如果可能的话,您可以提供更多具有类似问题的链接吗@PraveEnkuMar算法本身在维基百科上描述得很好。对于实践,你可以考虑下一个问题:,CUTE不是一个函数,它是一个数组,我的坏,也许这个修复会更好。
do until end of array{
b=compute_b() //Compute sum till you encounter negetive number
c=compute_c() //Compute sum till you encounter a positive number
a=max+b+c;
if(a>c)
{
if(a>max)
{
max=a;
}
}
else
{
if(c>max)
{
max=c;
}
}
}
print max