【问题标题】:Find the missing number from an unsorted array using divide and conquer and median numbers使用分治法和中位数从未排序的数组中查找缺失的数字
【发布时间】:2020-07-20 04:09:10
【问题描述】:

假设我们有一个未排序的数组,其中的数字从 0 到 n(n = 2^k - 1,k 是一个整数)除了一个。我的目标是找到丢失的号码。

我知道 XOR 方法或 sum 方法。但是,我必须使用分而治之的策略以及与数组的中位数有关的东西。

我的想法是找到数组的中位数,然后递归地将数组分成2个数组。 (一个将具有小于或等于中位数的数字,而另一个将具有更大的数字。类似于二进制搜索)。

但是,我认为这行不通。您建议进行哪些更改?

【问题讨论】:

    标签: arrays median divide-and-conquer


    【解决方案1】:

    这是另一个想法。

    分治法

    1. 让缺失的号码mn / 2
    2. 计算小于m的数字。
    3. 如果计数小于m
      1. 那么,我们知道缺失的数字小于m
      2. 否则,缺失的数字大于等于m

    继续这样做,直到找到丢失的号码。

    Python 实现:

    def missingNumber(nums):
    
        lo, hi = 0, len(nums)
    
        while lo < hi:
            m = (lo + hi + 1) // 2
            smaller = sum(x < m for x in nums)
    
            if smaller < m:
                hi = m - 1
            else:
                lo = m
    
        return lo
    

    【讨论】:

    • 如果我错了,请原谅我,但我理解在第 3 步中,您的意思是我必须在数组中具有小于或大于 m 的数字的部分重复。这不需要对数组进行排序吗?
    【解决方案2】:

    您可以将数组分成 2 个数组,一个值较小,另一个值大于您的中位数。您可以根据第一句话的假设检查这两个数组应该有多少元素。
    那么其中一个数组必须比它应该的小1。因此您可以在那里搜索。
    然后,您的退出条件将类似于数组应该包含 x 和 x 之间的所有元素(所以只是 x),但它是空的。因此 x 是缺失的元素。

    【讨论】:

    • 首先非常感谢您的回答!!我也想过这个解决方案,但我在退出条件方面遇到了麻烦。你说“数组应该包含 x 和 x 之间的所有元素(所以只有 x),但它是空的。因此 x 是缺失的元素。”是什么意思?我怎么知道 x 是哪个数字?
    猜你喜欢
    • 2017-01-19
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多