Given a sorted array, and two elements one from left half and other from the right are swapped.Find the swapped elements.
The answer is obvious in O(n), but I want to know is it possible in O(log n)?
答案 0 :(得分:3)
由于可以保证交换的元素形成不同的数组(“从左半部分到右边部分”):
首先,我们可以简单地遍历数组的前半部分,在O(n/2) = O(n)
然后我们可以使用这个交换元素在O(log n/2) = O(log n)
所以,它仍然是O(n) + O(log n) = O(n)
,但实际上它可能比天真的方法快一点。
答案 1 :(得分:0)
如果不完全扫描左半部分或右半部分,这是不可能的。所有未刷新的元素都与排序数组中的相同,因此它们无法为您提供搜索交换元素的线索,这是O(logN)二进制搜索等基础。
所以没有比O(N)更好的东西了。
答案 2 :(得分:0)
如果交换的元素是镜像的(即左手的第三个 - 从右手开始的第三个 - 结束),那么你可以这样做:
int rightOutlierIdx = arr.length - 1 - firstOutlierIdx
arr[rightOutlierIdx]
应该更快