0

给定一个目标 K 和一个不同元素的数组,任务是从数组中删除总和为 K 的所有对。

这是我遵循的方法

for(i=0;i<N;i++)
    cin>>array[i];
cin>>K;
map<int, int> mp;
for(i=0;i<N;i++)
{
    if(mp.find(array[i])==mp.end())
        mp[array[i]] = 1;
    else
        mp[array[i]]++;
}

删除逻辑

for(i=0;i<N;i++)
{
   if(mp[K-array[i]]>0)
   {            
       mp.erase(K-array[i]);
       mp.erase(array[i]);
    }
}

打印输出:

cout<<mp.size();

输入 :

array = 6 5 4 2 1 0
K = 6

程序输出

4

预期产出

0
4

1 回答 1

1
if(mp[K-array[i]]>0)

std::map::operator::[]如果元素不存在将添加

您将必须找到并删除如下:

for(int i=0;i<N;i++)
{
   if(mp.find(K-array[i]) != mp.end()  && 
      K-array[i] != array[i])
      //~~~~~~~~~~~~~~~~~~~~~ check required to see k/2 = array[i]
      // Note: all numbers are distinct 
   { 
       mp.erase(K-array[i]);
       mp.erase(array[i]);
   }
}

更好的策略是在扫描期间使用删除元素std::unordered_set

std::unordered_set<int> s;

for(const auto& ele: array) {
    auto it =  s.find( K - ele);
    if ( it == s.end() ) {
     s.insert(ele);   
    } else {
        s.erase(it);
    }
}

std::cout << s.size();

here

于 2020-01-20T11:24:10.890 回答