用于计算数组中存在和的对的数量的算法

时间:2017-08-18 10:41:58

标签: c++ arrays algorithm

给定一个N个整数数组。我如何计算数组中存在总和的对数?

E.g。 int a[] = {1, 3, 4, 6, 7}。这里有三对:(1 + 3)= 4,(3 + 4)= 7,(1 + 6)= 7.

给定数组中没有重复的数字,并且数组没有排序。也可以更改数组,不需要维护数组。

我尝试了以下两个代码,但我希望将代码的复杂性降低到小于O(n ^ 2)。

尝试1 :(复杂度为O(n ^ 3))

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
main(){
    int i,input,j,n,ans=0,sum;
    cin>>n;
    vector<int> vec;
    for(i=0;i<n;i++){
        cin>>input;
        vec.push_back(input);
    }
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            sum=vec[i]+vec[j];
            if(find(vec.begin(),vec.end(),sum)!= vec.end()){
                ans++;
            }
        }
    }
    cout<<ans;
}

2 个答案:

答案 0 :(得分:0)

我不确定这是否有助于降低复杂性,但我认为这样做比较简单,因为你没有在你正在使用的函数中声明任何变量,节省内存和时间:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool checkForEveryElement(vector<int> vec,int sum)
{
    for( int i=0; i<vec.size(); i++)
    {
        for(int j=i+1; j<vec.size(); j++)
           if(vec[i] + vec[j] == sum)
             return 1;
    }    
    return 0;
}
void main(){
    int i,input,j,n,ans=0,sum;
    cin>>n;
    vector<int> vec;
    for(i=0;i<n;i++){
        cin>>input;
        vec.push_back(input);
    }
    sort(vec.begin(),vec.end());
    for(i=0;i<n;i++)
        if(checkForEveryElement(vec,vec[i])){
            ans++;
        }
    cout<<ans;
}

答案 1 :(得分:0)

您可以通过使用数组或向量来完成它,这样您就可以作为冒泡排序算法进行迭代;所以第一个循环(外部)从元素0开始直到结束,内部开始形成外部循环索引+1,以避免元素与自身相加。每个内循环我们计算元素i +元素i + 1的总和。 将总和存储在临时变量中。最后一个内部循环从i + 2开始只要我用j(i + 1)求和,结果从第三个元素开始:

int a[] = {1, 3, 4, 6, 7};

for(int i(0); i < 5; i++){
    for(int j(i + 1); j < 5; j++){
        int sum = a[i] + a[j];
        for(int k(j + 1); k < 5; k++){
            if (sum == a[k])
                std::cout << "(" << a[i] << ", " << a[j] << "): " << sum << std::endl;
        }
    }
}

*我希望这可以帮助您减少经过的时间。