在已排序的连续数组中找到缺少的数字

时间:2014-03-26 14:50:22

标签: c arrays

我希望解决除O(n)复杂性之外的这个问题。这里已经描述的大多数问题都采用了[1,n]范围内的数字。在我试图解决的问题中,条件是: -

  1. 这是一个有序的连续数组列表
  2. 数字的开头可以来自任何地方,不一定是1-n
  3. 数组中缺少一个元素。找到那个号码。
  4. 我提出的简单的O(n)解决方案是: -

    int find_missing_num_ls (int arr[], int len)
    {
        int i = 0;
    
        for (i=0; i<len-1;i++) {
            if (arr[i+1] != (arr[i] +1))
                return (arr[i]+1);
        }   
    
        return -1;
    }
    

    有没有更有效的方法来找到它?

1 个答案:

答案 0 :(得分:3)

  1. 取最新(第一个)数组k
  2. 执行二分查找。 如果中间元素小于k + n/2,则需要在前半部分搜索,否则在第二部分搜索。重复一半的数组,直到数组大小足以使问题变得微不足道。
  3. 这应该是O(log n)。 如果你发现答案超过了最后一个元素,它也可能在第一个元素之前,因为我们假设第一个元素是正确的。