【发布时间】:2015-10-25 12:09:11
【问题描述】:
我想在给定列表中找到最小的缺失正整数。也就是说,如果给定一个正整数列表,即大于 0 且重复的整数,如何从那些缺少最小的那个中找到。
序列中总是至少缺少一个元素。
例如给定
std::vector<int> S={9,2,1,10};
答案应该是 3,因为缺少的整数是 3,4,5,6,7,8,11,...,最小值是 3。
我想出了这个:
int min_missing( std::vector<int> & S)
{
int max = std::max_element(S.begin(), S.end());
int min = std::min_element(S.begin(), S.end());
int i = min;
for(; i!=max and std::find(S.begin(), S.end(), i) != S.end() ; ++i);
return i;
}
这是 O(nmlogn) 的时间,但我不知道是否有更有效的 C++ STL 方法来做到这一点?
这不是一个练习,但我正在做一组自我提升的问题,我发现这是一个非常有趣的问题。我有兴趣看看如何改进这一点。
【问题讨论】:
-
你能举个例子吗?我不确定我是否理解您的意思。
-
当您说“高效”时,您是指程序员工作时间方面的时间效率、空间效率还是效率?
-
@ChristianHackl ,除非另有说明,否则通常暗示节省时间。在这种情况下,通常不考虑程序员的工作时间。
-
这是一个序列 {1,2,...} 暗示它是有序的吗?