数组中缺少整数

时间:2014-01-08 09:46:45

标签: algorithm

给定正整数列表,找到列表中不存在的最小整数。

例如: list = [7,4,9,1],答案是2。

什么应该是最快的算法(没有排序)来计算不在列表中的最小整数?

注意整数列表非常大,所以无法进行散列?

4 个答案:

答案 0 :(得分:0)

<强>为O(n *的log(n))

在O(n * log(n))中运行的最简单的算法是:

  • 使用Quicksort对数组进行排序,即O(n * log(n))
  • 遍历数组并找到列表中不是最大的最小元素O(n)

O(n)和O(1)额外空间

存在以O(n)运行的算法。 它的工作原理如下:

  • 遍历您的阵列。对于每个正数,我将array [i]的值设置为-1。忽略大于数组大小的值
  • 第二次遍历数组并找到第一个非负数的索引。 (O(n))的

答案 1 :(得分:0)

在一般情况下,我会

  1. 对数组进行排序(根据您的典型数组选择相关排序或使用自适应排序功能)
  2. 遍历数组以找到第一个缺失的整数

答案 2 :(得分:0)

如果数字唯一,您可以在O(nlogn)中使用二进制搜索。缺失值最多为n。

  • 设置低= 0,高= n,
  • 设置a =低+(高 - 低)/ 2
  • 计算低和高之间的值小于或等于a
    • 如果它不到一半,重复为高= a
  • 计算低和高之间的值大于a
    • 如果它低于一半重复低= a
  • 否则没有解决方案(所有值都在数组中)

答案 3 :(得分:0)

// Mark arr[i] as visited by making arr[arr[i] - 1] negative. Note that 
// 1 is subtracted because index start from 0 and positive numbers start from 1
for(i = 0; i < size; i++)
{
    if(abs(arr[i]) - 1 < size && arr[abs(arr[i]) - 1] > 0)
      arr[abs(arr[i]) - 1] = -arr[abs(arr[i]) - 1];
}

// Return the first index value at which is positive
for(i = 0; i < size; i++)
    if (arr[i] > 0)
      return i+1;  // 1 is added becuase indexes start from 0
}

2步算法从数组中找到最小的正缺失元素

  1. 我们遍历包含所有正数的数组并标记元素x的存在,我们将索引x处的值的符号更改为负数。如果x> size,则忽略x。
  2. 我们再次遍历数组并打印第一个具有正值的索引。 (请记住,当数组从第0个索引开始时,它将是索引+ 1)
  3. Time: O(n) Space: O(1)