【发布时间】:2015-06-17 13:22:27
【问题描述】:
我正在尝试在总和等于 k 的数组中查找所有对。我当前的解决方案需要 O(n*log(n)) 时间(下面的代码 sn-p)。谁能帮我找到更好的解决方案,O(n) 或 O(lgn) 可能是(如果存在)
map<int,int> mymap;
map<int,int>::iterator it;
cin>>n>>k;
for( int i = 0 ; i < n ; i++ ){
cin>>a;
if( mymap.find(a) != mymap.end() )
mymap[a]++;
else
mymap[a] = 1;
}
for( it = mymap.begin() ; it != mymap.end() ; it++ ){
int val = it->first;
if( mymap.find(k-val) != mymap.end() ){
cnt += min( it->second, mymap.find(k-val)->second );
it->second = 0;
}
}
cout<<cnt;
【问题讨论】:
-
This 可能会有所帮助。
-
在处理之前,您可能会混淆复杂度 O(f(n)) 的 n 和给定的 n 参数。您可以考虑重命名参数。另外我认为复杂度取决于参数,我们将其命名为 k。
-
由于数组是排序的,当你添加
first和last的时候结果太大了,移动哪个迭代器,如果小了移动哪个迭代器? -
@PuRaK - 这不是我想要的。我需要总和 >= k 的对(不仅仅是 sum = k)
-
“我试图在数组中找到总和等于 n 的所有对”这两者都与标题相矛盾,并且在(预期的)线性时间内是可能的。