可能重复:
How to find the kth largest element in an unsorted array of length n in O(n)?
大家好, 我在采访中遇到了一个问题。
问题:
整数数组将作为输入给出,您应该在排序时找到中间元素,但不进行排序。
例如。
输入:1,3,5,4,2
输出:3
当你对给定的输入数组进行排序时,它将是1,2,3,4,5,其中中间元素是3。
你应该在一次通过中找到它而不进行排序。
任何解决方案吗?
答案 0 :(得分:2)
这是selection algorithm问题,即O(n)。
编辑,但如果您确定项目是连续的,您可以计算最小和最大元素数量(一次通过)并返回[最小+(最大 - 最小+ 1)/ 2] < / p>
答案 1 :(得分:0)
对我而言,听起来你可以直接使用std::nth_element - 不知道这是否是可接受的答案。
答案 2 :(得分:0)
您可以使用“已修改”的快速排序来查找它。它以O(n ^ 2)运行,但平均来说应该相当快。你所做的就是每次选择一个支点时,你都要检查有多少元素小于支点,有多少元素更大。如果有相同的元素小于和大于枢轴,则枢轴是中位数。如果不是,则只能递归到包含元素的部分。最糟糕的情况是,您将执行完整的排序。
示例:
包含7个元素的数组,我们正在寻找第4个最小的元素。
5 3 8 6 7 1 9
假设quicksort选择3作为枢轴,而不是:
1 3 5 8 6 7 9
现在,您希望子阵列中的第二个最小[5,8,6,7,9]。继续前进,直到枢轴是您在当前迭代中搜索的第k个最小值。
我认为这个解决方案对于面试问题非常有用,尽管你应该提到有一个O(n)确定性解决方案。