说实话,这是一个面试问题。我知道如果数组完全排序,那么我可以使用二进制搜索,这是O(logN)。但现在的条件是:给定一个数组部分是不是排序部分,如何找到一个特定的元素?
- 某些部分是排序而其他部分不是。
- 我们不知道哪一部分是排序的,也不知道这部分是多长时间。
我只能想到一个完整的阵列扫描解决方案,它是O(N)。但采访者说有一个O(logN)解决方案。请帮忙。
说实话,这是一个面试问题。我知道如果数组完全排序,那么我可以使用二进制搜索,这是O(logN)。但现在的条件是:给定一个数组部分是不是排序部分,如何找到一个特定的元素?
我只能想到一个完整的阵列扫描解决方案,它是O(N)。但采访者说有一个O(logN)解决方案。请帮忙。
面试官是错的。不知道排序部分的起始位置及其大小,无法在O(logN)中搜索它。
要么你没有讲完整个问题,要么你的面试官完全错了。这里有一个适合你的描述的例子。
[1, 2, 3, 4, 5, 9, -1, 8, 0, 8, -2, 4, 7, 6]
正如你看到的第5个元素进行排序。但它不能帮助你找到我的阵列中的6个位置。您仍然需要O(n)来查找元素。
把你的问题提到一个极端,如果排序部分包含2个元素和未排序部分是n-2
元素?他还可以在O(log n)
中搜索吗?
只是一个建议给你。一旦你听到一些你实际上不能相信的东西,请一个人向你解释一个想法,并想一个使这个想法无用的反例。
不错的心态调整,我总是在思考一个反例的时候想到极端,在这种情况下,我会说如果排序的部分只包含1个元素=未排序的数组:)。 – shole
我认为你的面试官对你说谎。任何具有其第一个元素作为其最小元素的数组都满足此条件(假设升序)。在O(log n)时间内无法在这种类型的数组中找到任意元素......您确定这些是* only *两个规定吗? – mwm314
也许他在等你,让他证明他错了? –