给定具有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)方法。如何降低复杂性?
答案 0 :(得分:1)
您可以使用以下事实:如果某个数组只包含小于或等于X
的整数,则其所有子数组也都具有此属性。让我们找到每个索引i
最大可能的子数总和,以i
(sub_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)
我只是给你一个简单的一步一步的方法
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.
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";