我有以下任务:
编写具有标题的函数
:long long CountSumS(矢量&a,int s)
函数将返回带(a[i],a[j])的对数;i<ja[i]+a[j]=s)
实例
:
如果a=(8,2,3,8,7,5)且s=10,函数将返回3,对为(8,1),(2,8)和(3,7)
我也在努力有效地做到这一点,所以简单地取下所有其他元素,然后检查所有值的和,这不是我想要的解决方案。
我尝试使用无序多映射解决这个问题,我有以下功能:
long long CountSumS(vector<int>& v, int sum)
{
int cnt = 0;
typedef unordered_multimap<int, int>::iterator iter;
unordered_multimap<int, int> m;
for (int i = 0; i < v.size(); i++)
m.insert(make_pair(v[i], i));
for (int i = 0; i < v.size(); i++)
{
int x = sum - v[i];
//the needed value to make the sum
pair<iter, iter> result = m.equal_range(x);
int count = distance(result.first, result.second);
if (count != 0)
{
for (auto iter = result.first; iter != result.second; iter ++) //iterates through the values
{
if (iter->second > i)
cnt++;
/*else
iter = m.erase(iter);*/
}
}
}
return cnt;
它低效地解决了这个问题,因为毕竟它只是用某个键检查所有元素,所以我想到的解决方案是删除映射中所有值小于“I”的元素,因为这意味着元素已经在向量中传递,无论如何我都不能用它来求和。在/**/中编写的部分是我尝试在迭代器中擦除值的方法,但在尝试运行代码时遇到了一个错误(图)(
https://i.stack.imgur.com/Nl3SI.png
). 我想知道是什么导致了这个错误。
我很感谢大家对一个更好的方法的投入,这是一个更简单的解决方案,这只是我能想到并尝试实施的第一件事。