给出一个正整数数组,您将找到i 该问题通常被称为“四和”或“四和”。 问题在于以下代码在ayush_ar0204的CodeChef解决方案中循环遍历该数组(s是该数组): 检查第21行。它说j = k-1。现在,我们正在为i,k,l循环。是不是我们只检查四倍(i,k-1,k,l)而不是(i,j,k,l)?该代码运行良好,但是,从逻辑上来说对我来说是不正确的。 sort(s,s+n);
for (long long k=2;k<(n-1);++k){
if (s[k] >= t)
break;
long long j=k-1;
for(long long i=0;i<j;++i){
if(s[i]+s[j]<t){
++counts[s[i]+s[j]];
}
else{
i=j;
}
}
for(long long l=k+1;l<n;++l){
if ((t-(s[k]+s[l]))>=0){
answer+=counts[t-(s[k]+s[l])];
}
else{
l=n;
}
}
}
答案 0 :(得分:1)
此解决方案将运行时间从原始O(n 4 )减少到O(n 2 )。看起来有些奇怪,因为它正在重用以前计算的信息。
在任何时候,我们都希望counts[m]
(其中counts
充当字典)包含(i, j)
与i < j < k
的对数,使得s[i] + s[j] == m
。在循环从k == 1
开始之前,这确实是正确的,因为没有对(i, j)
,所以每个计数都是0。每次增加k
时,我们必须添加到计数是带有j == k - 1
的计数。如果为j < k - 1
,则该对已在循环的最后一次迭代中计数。使用counts
数组意味着我们不再关注特定的四倍体(i, j, k, l)
;相反,对于k
的每个值,我们遍历所有可能的l
值,并将具有正确总和的有效(i, j)
元组的存储计数加到总数中。