给定一个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;
}
答案 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;
}
}
}
*我希望这可以帮助您减少经过的时间。