我需要从一系列非负整数中找到最小缺失元素。
例如:我有:0 5 10 4 3 1
The missing element is 2.
在上面的序列中,缺失的元素是2 6 7 8 9。其中最小值是2,所以答案是2。
蛮力。我将对序列进行排序并获得nlogn中的最小元素。我正在寻找更好的解决方案。有什么帮助吗?答案 0 :(得分:4)
在ISO C99中:
unsigned least_absent(unsigned seq_sz, unsigned seq[seq_sz])
{
bool tab[seq_sz];
memset(tab, 0, sizeof(tab));
for(unsigned i=0; i<seq_sz; i++)
if(seq[i] < seq_sz)
tab[seq[i]] = true;
for(unsigned i=0; i<seq_sz; i++)
if(!tab[i])
return i;
return seq_sz;
}
这是O(n)时间,O(n)记忆。
答案 1 :(得分:2)
可以使用哈希表在O(n)中完成,这意味着O(n)额外的内存:
答案 2 :(得分:1)
list = sort(list)
last_element = list[0]
for(i = 1; i < list.size; ++i){
if(list[i] - last_element > 1)
return last_element + 1 // return the next number after last_element
last_element = list[i]
}
return -1 // return -1 if unable to find a number
答案 3 :(得分:1)
此解决方案是O(n)的时空复杂度。
def solution(A):
#Python 3.6
a = set() #to store positive numbers in the given array
b = set() #to store missing positive numbers in the given array
for item in A:
if item<=0:
continue
a.add(item)
if item in b:
b.remove(item)
if item + 1 not in a:
b.add(item+1)
#if all numbers are negative in the given array
if len(a) == 0:
return 1
#if 1 is not in the given array, 1 is the answer
if 1 not in a:
return 1
return min(b)
答案 4 :(得分:0)
伪代码:
for(int i = 0 ; i < Int.MAX ; i++)
{
if(i is not in list)
{
return i
}
}
当然有可能对此进行优化,但作为初始草案,为了让你的测试通过(你确实有测试,对吧),这是一个非常简单的解决方案,它可以让你对你的测试充满信心正确,如果需要,可以让你自由优化。
答案 5 :(得分:0)
无需排序。
浏览列表并找到2个最小的值,它们之间的区别是 大于1.(O(N))。
打印(找到最少值)+1。
答案 6 :(得分:0)
O(NlogN)
最坏情况为mergesort)O(N)
最坏情况)答案 7 :(得分:0)
我能想到的最简单的方法是对列表进行排序,然后查看第一个差距。
我不确定有什么更简单的东西。即使您以某种方式解析列表而没有实际排序,您仍需要跟踪您在此过程中发现的差距,然后随时消除它们。我认为无论如何它可能在逻辑上等同于排序算法。可能是错的。
答案 8 :(得分:0)
首先对元素进行排序。 然后开始在序列中找到数字,如:
for (int i=0; i<numbers.length; i++) {
if (numbers[i] != i ) {
System.out.println("Missing number is: " + i); break;
}
}
答案 9 :(得分:0)
伪代码:
a is the array
s is a sorted set (examples : a binary search tree, or a red/black tree)
insert 0 in s
for each v in a
remove v from s
insert v+1 in s
result is min(s)
答案 10 :(得分:0)
如果你知道没有重复的元素你可以在O(N log N)时间内使用O(1)内存:
你做一个binary search来找到答案:最初你知道答案在0到N-1之间,对于每一步,你要计算多少个数小于k(k是二进制的中间元素)搜索段),如果此数字等于k,那么序列的那部分就完成了,所以你需要搜索上部,否则你需要搜索下部。
答案 11 :(得分:0)
改进一些想法(@Faisal Feroz,@ slacker,@ dahunter,@ user453201): 在传递值列表(排序或将值插入哈希/查找表)期间,保存最小值。然后,为了找到缺失的元素,从这个最小值开始而不是0.小改进,但它仍然更好。