当前位置: 首页 > 知识库问答 >
问题:

最大和子数组,使得每个元素都小于或等于 X

公冶元青
2023-03-14

给定一个有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个答案

晏正豪
2023-03-14

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";
闻人志
2023-03-14

我只是给你一个简单的循序渐进的方法

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

(最小整型值)

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.
萧英睿
2023-03-14

你可以利用这样一个事实,如果某个数组只包含小于或等于< code>X的整数,那么它的所有子数组也有这个属性。让我们为每个索引< code>i找到子数组的最大可能和,结束于< code > I (< code > 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

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

 类似资料:
  • 我想找到给定正整数数组中元素的最大数目,使得它们的和小于或等于给定的k。例如,我有一个数组 答案是3,因为1,2,3是求和6的最大元素。

  • 问题内容: 给出以下表1: 和Table2包含一些RefID和intVals,例如 需要SQL语句来获取每个RefID和NULL的下一个更大的intValue(如果在表1中找不到),则以下是预期结果 帮助将不胜感激! 问题答案: 派生表从给定的表1和表2检索最小值。外部查询仅检索someValue。 这是带有现场测试的Sql Fiddle。

  • 给定任何自然数数组,例如:[2,1,2,3]查找数组是否可以转换为Max数组(打印-“是”)或如果不能(打印-“否”) 使其成为最大数组 - 将数组的每个元素转换为等于其最大元素。在上面的例子中,它将是[3,3,3,3],但是通过遵循这些规则 - 一次将任何两个元素增加1(正好是2个元素。不能一次增加一个或多个元素) 多次执行此操作,直到将每个元素转换为最大元素(如果可能,请打印“YES”,否则打

  • 在一本书(算法导论,但我不记得是哪一章)中,我学到了求解两元素间最大差值问题: 两个元素之间的最大差,使得较大的元素出现在较小的数之后。 查找数组(至少包含一个数字)中和最大的相邻子数组。 例如,给定数组[-2,1,-3,4,-1,2,1,-5,4],相邻子数组[4,-1,2,1]的最大和=6。 为了解决的两元素间最大差异问题,可以将其转化为数组的最大子数组问题: 我在想为什么。

  • 给定一个数组形式的未排序(多)整数集,求其和大于或等于常量整数x的最小基数子集。 我们的集合是{4 5 8 10 10},x=15,所以最小基数子集和 这个问题与以下问题相关但不同:给定一个n个整数的列表,找到大于X的最小子集和在前面的问题中,作者要求得到一个和最接近X的子集,这里我们想要任何子集

  • O(n^2)算法简单。有没有人对此有更好的算法?