【发布时间】: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²)...