【问题标题】:Algorithm to count the number of pairs whose sum exists in the array计算数组中存在总和的对数的算法
【发布时间】:2018-01-27 00:39:16
【问题描述】:

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

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

【问题讨论】:

  • 检查所有对,如果它们的总和在数组中,则增加一个计数器
  • 显示你尝试了什么以及它是如何失败的。 SO 不是代码编写服务
  • 您的第二个算法是否将 (3 + 4)(1+6) 都计算为 7?
  • 另外,您的问题未明确说明。向量是否已排序?元素是唯一的还是重复的?向量可以改变,还是必须保持不变?
  • 我认为复杂度不可能低于 O(n²),即使只是列举可能的对也是 O(n²)...

标签: c++ arrays algorithm


【解决方案1】:

我不确定这是否有助于降低复杂性,但我认为这种方式更简单,因为您无需在正在使用的函数中声明任何变量,从而节省内存和时间:

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

【讨论】:

  • 您已将我的代码的复杂性增加到 O(n^3) 。我想减少而不是增加。
【解决方案2】:

您可以通过使用数组或向量来做到这一点,这样您就可以作为冒泡排序算法进行迭代;因此,第一个循环(外部)从元素 0 开始直到结束,内部开始形成外部循环索引 + 1,以避免将元素与自身相加。每个内部循环我们计算元素 i + 元素 i + 1 的总和。 将总和存储在临时变量中。最后一个最内层循环从 i + 2 开始只要 i 与 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;
        }
    }
}

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

【讨论】:

  • 你做了同样的事情,并将我的代码的复杂性增加到 O(n^3) 。我想减少它。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多