【发布时间】:2020-03-13 01:04:52
【问题描述】:
我有一个大小为 N 的数组(数字)。我需要找到唯一的最小元素,所以如果arr[5] ={1,2,3,1,2},答案是 3。
我用下面的代码试过了:
Int n = sizeof(arr)/sizeof(arr[0]);
sort(arr,arr + n);
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
if(arr[i] == arr[j]){
remove(arr,arr+n,i);
remove(arr,arr+n,j);
}
}
}
但问题是,这只有在我有 2 个相同的 arr 元素时才有效。我可以创建相同数量的条件,但我可以有 3 个或 4 个或 1000 个,所以这会很奇怪。那么有什么更优雅的方法来做到这一点呢?提前谢谢你。
【问题讨论】:
-
如果数组已排序,我假设它来自您的
sort调用,那么您不需要像这样的第二个内部循环。可以比较arr[i]和arr[i+1],如果相等则继续,否则arr[i]是最小值。 -
是的,但是我可以拥有 1000 个元素,这些元素与
arr[ i ]相同。 -
您也可以使用 HashSet,将所有值存储在其中,如果您看到重复则删除该值,然后在处理所有值后,您可以获得唯一的最小值,这样您将拥有一个O(N) 的时间复杂度。
-
使用
std::set,称为first和std::unordered_set,称为many。遍历数组。第一次看到一个值时,它进入first,如果再次看到它,它将从first中删除并进入many。当循环迭代完成时,first中的第一个值就是您的答案。很简单。
标签: c++ arrays sorting unique min