我想要2个循环->;1用于环路C

我想要2个循环->;1用于环路C,c,for-loop,C,For Loop,我正在解决算法问题 它是数组中的元素,成对->一个值 我输入数组的大小并添加值 我解决了这个问题,但在bigggg number-n遇到了时间复杂性问题 我如何解决这个时间复杂性问题 我试图解决一个循环,但不能很好 请帮帮我 #include <stdio.h> int main(void){ int n,m,i,j; int count=0; scanf("%d %d",&n, &m); int array[n]

我正在解决算法问题

它是数组中的元素,成对->一个值

我输入数组的大小并添加值

我解决了这个问题,但在bigggg number-n遇到了时间复杂性问题

我如何解决这个时间复杂性问题

我试图解决一个循环,但不能很好

请帮帮我

#include <stdio.h>

int main(void){
    int n,m,i,j;
    int count=0;
    scanf("%d %d",&n, &m);
    int array[n];
    for(i=0;i<n;i++){
        scanf("%d",&array[i]);
    }
    for(i=0;i<n;i++){
        for(j=i;j<n;j++){
            if(m==array[i]+array[j]){
                count++;
        }}
    }
    printf("%d",count);
    return 0;
}
#包括
内部主(空){
int n,m,i,j;
整数计数=0;
scanf(“%d%d”,&n,&m);
整数数组[n];

对于(i=0;i在排序之后,这里有一个简单的双指针技术。
它将按原样工作,因为没有重复

实际上,使用了两个索引,一个从数组开始,一个从数组结束。根据和的值,我们增加第一个或减少第二个索引

复杂性:O(n logn)表示排序,O(n)表示第二步

#包括
#包括
整数比较整数(常数无效*a,常数无效*b)
{
int arg1=*(常数int*)a;
int arg2=*(常数int*)b;
if(arg1arg2)返回1;
返回0;
}
整数计数和(整数*A,整数n,整数目标){
整数计数=0;
qsort(A,n,sizeof(int),compare_int);
int左=0;
int right=n-1;
while(左<右){
整数和=A[左]+A[右];
如果(总和==目标){
计数++;
左++;
对--;
}否则如果(总和<目标值){
左++;
}否则{
对--;
}
}
返回计数;
}
int main(){
inta[]={8,2,7,5,3,1};
int目标=10;
int n=sizeof(A)/sizeof(A[0]);
int ans=计数和(A,n,目标);
printf(“计数=%d\n”,ans);
返回0;
}

提示:对数组进行排序。然后使用两个索引执行一个循环,一个从数组开始,一个从数组结束。全局复杂性:O(n logn),用于排序。第二步:O(n)。请注意,在解决方案中,您允许向自身添加一个数字(
i=j
)。这是故意的吗?首先,我使用排序算法,我认为quick更好,对吗?第二,我故意
j=i
是最后一个不比较的索引元素。当然可以。你测试过你的代码吗?我想它会算作一个正确的解决方案。如果你想避免它,请使用
j=i+1