优于O(n ^ 2)算法,在包含前1000个整数中的999的数组中找到缺失的整数

时间:2013-03-11 17:12:51

标签: complexity-theory

假设我有一个包含999个单元格的数组,其中包含1-1000之外的所有数字,除了一个数字。找到这个数字最有效的方法是什么?我找不到比O(n平方)更好的方法。面试官告诉我有更好的方法。我该怎么办?

数组未排序。

3 个答案:

答案 0 :(得分:13)

1-1000中所有数字的总和是已知值。计算数组中数字的总和,然后减去两者,给出差异。

We know that the sum of from 1..n is n(n+1)/2。这是数学中相当普遍的结果,但如果你不熟悉它,你可以自己推导出它。

所以,你只需要对数组中的数字求和,然后从上面的值中减去该值,你就会知道缺少什么。

在代码中,这将是:

int findMissing(int [] inputArray) {
    //In the above scenario, inputArray.size() would be 999
    int range = inputArray.size() + 1;   //so, range is 1000
    int expected = range * (range + 1) * 0.5;  //we expect the sum to be 500,500
    int sum = 0;
    for (int x: inputArray) {
       sum += x;
    }
    //the missing number is the difference between what we expected, and what we found
    return expected - sum; 

这将是O(n)结果。

答案 1 :(得分:3)

就像那样:

 int sum = (1000 * 1001) / 2; // sum of the n first integers is: n*(n+1)/2
 for(int i : array) {
    sum -= i;
 }
 return sum;

答案 2 :(得分:2)

你可以使用求和, http://betterexplained.com/articles/techniques-for-adding-the-numbers-1-to-100/ 然后从求和中减去所有单元格的总和。

missingDigit = (Summation - totalFromCells);