最大和子子阵列,使得每个元素小于或等于X.

时间:2015-03-28 06:59:10

标签: algorithm

给定具有N个整数的数组A,我们需要找到子数组的最高和,使得每个元素小于或等于给定的整数X

示例:设N = 8,阵列为[3 2 2 3 1 1 1 3]。现在如果x = 2,那么如果我们考虑1个基本索引,则通过对A [2] + A [3]求和来回答4。如何在O(N)或O(N * logN)

中执行此问题

目前通过检查每个可能的子阵列而采用O(N ^ 2)方法。如何降低复杂性?

3 个答案:

答案 0 :(得分:1)

您可以使用以下事实:如果某个数组只包含小于或等于X的整数,则其所有子数组也都具有此属性。让我们找到每个索引i最大可能的子数总和,以isub_sum)结束。

sub_sum[i] = 0, if array[i] > X
sub_sum[i] = max(array[i], sub_sum[i - 1] + array[i]), otherwise

初始条件是:

sub_sum[1] = 0, if array[1] > X
sub_sum[1] = max(array[1], 0), otherwise

您可以使用上面的公式在一个循环中计算所有sub_sum值。您的问题的答案是sub_sum数组中的最大值。计算复杂度为 O(n)

答案 1 :(得分:1)

我只是给你一个简单的一步一步的方法


时间复杂度O(n)空间复杂度O(n)

1. Input array=A[1..n] and x be the element and ans= -INF

(最小的int值)

2. Take another array B[1..n]={0,0,...0}.

3. For i=1 to n 
    if(A[i]<=x)
     B[i]=1;

sum=0;
4. For i=1 to n
    if(B[i])
    sum+=A[i];
    else
    {
    ans=maximum of(sum,ans);
    sum= 0;
    }
5. ans is the output.

时间复杂度O(n)空间复杂度O(1)

Note ans= -INF;(smallest int value)
     sum=0;

1. for(i=1;i<=n;i++)
   //get input Ai in variable a(temporary int variable to store the elements)
   if(a<=x)
    sum+=a
   else
   {
    ans=max of (ans,sum);
    sum= 0;
   }

2. ans will be the output.

答案 2 :(得分:0)

O(n)C ++代码:

const int INF = 2147483647;
int A[] = {3,2,2,3,1,1,1,3};
int ArraySize = 8;

int X = 2;



int max = -INF; //currenly max
int si = -1; //starting index
int ei = -1; //ending index
int tmax = 0; //temp currenly max
int tsi = -1; //temp starting index
int tei = -1; //temp ending index


for (int i = 0;i<ArraySize;i++) {
    if (A[i]<=X) {
        tmax+=A[i];
        if (tsi==-1) tsi = i;
    }
    else {
        tei = i-1;
        if (tmax>max) {
            max = tmax;
            si = tsi;
            ei = tei;
        }
        tsi = -1;
        tei = -1;
        tmax = 0;
    }
}
cout<<"Max is: "<<max<<" starting from "<<si<<" ending to "<<ei<<"\n";