找到四倍数,使它们加起来等于一个特定的总数

时间:2019-11-26 22:25:51

标签: algorithm

给出一个正整数数组,您将找到i

该问题通常被称为“四和”或“四和”。

问题在于以下代码在ayush_ar0204的CodeChef解决方案中循环遍历该数组(s是该数组):

    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;
            }
        }
    }

检查第21行。它说j = k-1。现在,我们正在为i,k,l循环。是不是我们只检查四倍(i,k-1,k,l)而不是(i,j,k,l)?该代码运行良好,但是,从逻辑上来说对我来说是不正确的。

1 个答案:

答案 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)元组的存储计数加到总数中。