找出非负整数序列中缺少的最小元素

时间:2010-09-20 10:51:06

标签: algorithm

我需要从一系列非负整数中找到最小缺失元素。

例如:我有:0 5 10 4 3 1

The missing element is 2.

在上面的序列中,缺失的元素是2 6 7 8 9。其中最小值是2,所以答案是2。

蛮力。我将对序列进行排序并获得nlogn中的最小元素。我正在寻找更好的解决方案。有什么帮助吗?

12 个答案:

答案 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)额外的内存:

  1. 将数字插入哈希表,在O(n)中完成。
  2. 从零到列表的最大值,并检查该号码是否存在。第一个不存在的数字就是答案。这也在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)

无需排序。

  1. 浏览列表并找到2个最小的值,它们之间的区别是 大于1.(O(N))。

  2. 打印(找到最少值)+1。

答案 6 :(得分:0)

  1. 对数组进行排序(O(NlogN)最坏情况为mergesort)
  2. 从头开始循环,直到遇到两个相邻元素之间的差异大于1。 (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.小改进,但它仍然更好。