是否有一种快速的方法来查找元素向量中的所有单个元素(仅出现一次)?向量中的所有元素都是单一的或双重的(出现两次)。我的答案是对所有元素进行排序,然后删除重复出现的元素。有更快的方法吗?
答案 0 :(得分:2)
因此,对于足够小的n(<= 1e8)个排序和删除(使用std::sort()
和std::unique
)方法,它仍然比哈希表要快。
示例代码:O(n log n)
vector<int>A = {1,2,3,1,2,5};
sort(A.begin(),A.end());
A.erase(unique(A.begin(),A.end()),A.end());
for(int&x:A)
cout<<x<<" ";
答案 1 :(得分:1)
如果您的元素是可哈希的,则可以使用std::unordered_map<T, int>
来存储每个元素的计数,这将花费摊销的线性时间:
template<typename T>
std::vector<T> uniqueElements(const std::vector<T>& v) {
std::unordered_map<T, int> counts;
for(const auto& elem : v) ++counts[elem];
std::vector<T> result;
for(auto [elem, count] : counts)
if(count == 1)
result.push_back(elem);
return result;
}
对于小列表,排序然后进行线性遍历可能仍会更快。 另外请注意,这会复制您的元素,在某些情况下可能也会很昂贵