这可能是一个微软面试问题。
从排序数组中找到第 k 个最小的元素(忽略重复项)。
[编辑]:数组可能包含重复项(未指定)。
想了很多次,但还是在问自己:还有更好的解决方案吗?
方法一:
取一个最大堆并插入前 k 个唯一元素[可以很容易地检查]。堆化堆。
现在,当一个新元素小于堆头时,用这个新元素替换堆头。最后,如果堆的大小为 k,则堆头指示第 k 个最小元素,否则第 k 个最小元素不存在。
时间复杂度:O(NlogK)
空间复杂度:O(K)
方法2[更好的方法]:
元素可以正确复制。因此,通过与之前的元素进行比较来检查唯一元素,如果到目前为止发现的唯一变量计数为 k,则停止。
时间复杂度:O(N)
空间复杂度:O(1)
方法3[更好的方法(可能)]:
也可以使用快速排序分区算法的修改版本。但可能会导致最坏的情况,因为数组已经排序。
这里出现了两个问题:
1.如果数组包含重复项,它是否有效?
2.它会比我的第二个方法更好吗?
我想知道是否存在任何 O(logn) 解决方案?