在不破坏订单的情况下从系列中查找唯

时间:2015-04-07 11:16:36

标签: c++ algorithm stl

我是stackOverflow的新手。如果是重复的帖子,请帮助我。 我是C ++ / STL开发人员,正在寻找:

在整数上从系列中找到唯一的数字而不改变它的顺序。例如:i / p:10,4,3,6,1,0,4,4,4,10,5,9,0,6,15,.... o / p(预期结果):10, 4,3,6,1,0,5,9,15,....

约束: - 时间复杂度不应该最差(N ^ 2)。需要在更短的时间内解决它。 - 记忆力充足。 - 熟练,如果你能解释一下我必须用来解决这个问题的STL容器或算法。

我尝试使用unorder_set,但它打破了排序,所以有点困惑。

3 个答案:

答案 0 :(得分:0)

您可以使用std :: unordered_map:

#include <iostream>
#include <vector>
#include <unordered_map>

int main() {
 std::unordered_map<int, int> mynums;
 std::vector<int> myvect = {10,4,3,6,1,0,4,4,4,10,5,9,0,6,15};
 for (auto myelem: myvect) {
   mynums[myelem]++;
 }
 for (auto myelem: mynums) {
   if (myelem.second > 1) {
     std::cout << "Value "<<myelem.first << " " << myelem.second << " times" <<std::endl;
   }
 }
 return 0;
}

该方法仅打印重复数字,并且应该分摊O(n)复杂度。

符合您兴趣的代码如下:

#include <iostream>
#include <vector>
#include <unordered_map>

int main() {
 std::unordered_map<int, int> mynums;
 std::vector<int> myvect = {10,4,3,6,1,0,4,4,4,10,5,9,0,6,15};
 for (auto myelem: myvect) {
   if (mynums[myelem] == 0) {
      std::cout << myelem << ",";
   }
   mynums[myelem]++;
 }

 return 0;
}

答案 1 :(得分:0)

您可以使用std::unique,然后添加resize来调整vector(或其他容器)的大小:

auto it = myvector.begin();
it = unique (myvector.begin(), myvector.end());                                                                
myvector.resize(distance(myvector.begin(),it) );

答案 2 :(得分:0)

O(n²)中的天真方法:

std::vector<int> find_unique_numbers(const std::vector<int>& v)
{
    std::vector<int> res;

    for (auto e : v) {
        if (std::find(res.begin(), res.end(), e) == res.end()) {
            res.push_back(e);
        }
    }
    return res;
}

Live demo