代码之家  ›  专栏  ›  技术社区  ›  Julia

矢量中相加为总和S的值的数量

  •  0
  • Julia  · 技术社区  · 1 年前

    我有以下任务:

    编写具有标题的函数 :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 ). 我想知道是什么导致了这个错误。

    我很感谢大家对一个更好的方法的投入,这是一个更简单的解决方案,这只是我能想到并尝试实施的第一件事。

    1 回复  |  直到 1 年前
        1
  •  0
  •   MikeCAT    1 年前

    使用 iter ++ 之后 iter = m.erase(iter) 可能导致迭代器超限。

    在每个迭代中只执行其中一个。

                for (auto iter = result.first; iter != result.second; ) //iterates through the values 
                {
                    if (iter->second > i)
                    {
                        cnt++;
                        iter++;
                    }
                    else
                        iter = m.erase(iter);
                }