【问题标题】:Find missing number in sorted array在排序数组中查找缺失的数字
【发布时间】:2017-11-07 06:58:19
【问题描述】:

这段代码有什么问题?无法使用二进制搜索在连续数组中搜索缺失的数字。

a = [1,2,3,4,5,7,8]

lent = len(a)
beg =0
end = lent-1

while beg < end:
    mid = (beg + end) / 2
    if (a[mid]-a[beg])==(mid - beg):
        beg = mid + 1
    else:
        end = mid -1
    if(beg == end):
        mid = (beg + end) / 2
        print "missing"
        print a[0]+ beg

【问题讨论】:

    标签: binary-search


    【解决方案1】:

    //使用java实现算法。

    static int missingNumber(int [] nums) {
        int i=0;
        while(i < nums.length) {
            int correct = nums[i];
            if (nums[i] < nums.length && nums[i] != nums[correct]) {
                swap(nums, i, correct);
            } else {
                i++;
            }
            }
    
        for( int index=0; index<nums.length; index++){
            if(index != nums[index]) {
                return index;
            }
        }
        return nums.length;
    }
    static void swap(int[] nums, int first, int second) {
        int temp = nums[first];
        nums[first] = nums[second];
        nums[second] = temp;
    }
    

    【讨论】:

    • 感谢您提交拉维。一般来说,我强烈鼓励任何代码块使用内联 cmets,尤其是与他人共享的代码块。如果在每个关键行(即方法签名或条件)上用英文解释您的意图,则此提交将更容易遵循和调试。
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:
    int findMiss(int arr[], int low, int high)
    {
        if(low>high)
            return -1;
    
         if(arr[low]-1 != low)
             return arr[low]-1;
    
         int mid = (low + high) / 2;
         if(arr[mid]-1 != mid)
             return findMiss(arr,low,mid);
         else
             return findMiss(arr,mid+1,high); 
    }
    

    【讨论】:

    • @GeorgiGeorgiev:从排序数组中找到第一个缺失的数字。从数组中计算第一个中间位置,并将中间位置的 int 元素与中间索引进行比较。如果中间位置的 element-1 不等于中间,则意味着我们需要遍历中间的左侧(即从第 0 个位置到中间),否则遍历中间的右侧(即从中间位置到结束位置)。
    【解决方案3】:

    更新 #1:是的,还有一个错误。你说得对。这是更新版本

    试试这个变种:

    a = [1,2,3,4,5,7,8]
    
    lent = len(a)
    beg =0
    end = lent-1
    
    while beg < end:
        mid = (beg + end) / 2
        if (a[mid]-a[beg])==(mid - beg):
            beg = mid
        else:
            end = mid
        if abs(beg-end) <= 1:
            print "missing: %s" % (a[0] + max(beg, mid),)
    

    结果:

    missing: 6
    

    另外,尝试使用函数,这样您就可以轻松地测试和调试不同列表上的代码:

    def find_missing(a):
        lent = len(a)
        beg =0
        end = lent-1
    
        while beg < end:
            mid = (beg + end) / 2
            if (a[mid]-a[beg])==(mid - beg):
                beg = mid
            else:
                end = mid
            if abs(beg-end) <= 1:
                return a[0] + max(beg, mid)
    
    a = [1,2,3,4,5,7,8]
    print find_missing(a)
    
    a = [1,3,4,5,6]
    print find_missing(a)
    
    a = [1,2,3,4,5,7,8,9,10]
    print find_missing(a)
    

    结果:

    6
    2
    6
    

    【讨论】:

    • 不适用于 a = [1,2,3,4,5,7,8,9,10] 。结果仍应为 6,但给出 9。
    • 是的,你是对的。固定的。这是因为,通常我们使用二进制搜索来查找现有元素:)
    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多