【发布时间】:2021-10-10 10:33:07
【问题描述】:
问题如下:给定一个数字's',s ∈ [0, 10^6],和一个数字'n',n ∈ [0, 50000],然后是n个数字,我们有找出有多少个数对的总和等于 's' 数(我们必须使用映射或集合来解决它)
示例如下:
输入:
5 (this is s)
6 (this is n)
1
4
3
6
-1
5
输出:
2
解释:这些是 (1,4) 和 (6,−1) 对。 (1 +4 = 5 和 6 + (-1) = 5)
这是我的“解决方案”,我什至不知道它是否正确,但它适用于我们得到的示例。
#include <iostream>
#include <map>
#include <iterator>
using namespace std;
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
int s;
cin >> s;
int n;
cin >> n;
map<int, int> numbers;
int element;
int counter = 0;
for(int i=0; i<n;i++)
{
cin >> element;
numbers.insert(pair<int, int>(element, s-element));
}
for(map<int, int>::iterator it = numbers.begin(); it != numbers.end(); it++)
{
map<int, int>::iterator it2 = it;
while(it2 != numbers.end())
{
if(it->second == it2->first)
{
counter++;
break;
}
it2++;
}
}
cout << counter << "\n";
return 0;
}
提前感谢您的回答!我还是个初学者,正在学习中,抱歉。
【问题讨论】:
-
忘了补充:允许的最长时间为0.11秒,我的解决方案比我在测试站点上运行时慢。那么,如果解决它的方法是正确的,我怎样才能让它更快更高效呢?
-
也许可以试试
std::unordered_map,它有平均O(1)查找——它是一个哈希映射。以后也可以随时编辑您自己的问题以添加更多信息。 -
没关系,第二个 for 循环是 O(n^2) 并且完全没有必要,您可以只检查
element, s-element的存在而不是插入。 -
使用
std::map::find代替内部循环。当你用没有重复的输入来确定它时,想想你将如何处理重复。 -
@Quimby 这样我就可以完全删除第二个 for 循环和 while 循环,只使用第一个 for 循环来解决它?