我是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,但它打破了排序,所以有点困惑。
答案 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;
}