这可能是微软面试的问题。
从排序数组中找出第k个最小元素(忽略重复) [编辑] :数组可能包含重复项(未指定)。
多次思考,但仍在质疑自己:是否还有更好的解决方案?
拿一个最大堆&插入第一个k个独特元素[可以轻松检查]。堆积堆。
现在,当一个新元素小于堆的头部时,用这个新元素替换head将它堆积起来。最后,如果堆的大小为k,则堆的头指示第k个最小元素,否则第k个最小元素不存在。
时间复杂度:O(NlogK)
空间复杂度:O(K)
元素可能是正确的。因此,通过与之前的元素进行比较来检查独特元素。如果到目前为止发现的唯一变量计数为k,则停止
时间复杂度:O(N)
空间复杂度:O(1)
也可以使用快速排序分区算法的修改版本。但是,由于阵列已经排序,可能会导致最坏的情况
这里出现两个问题:
1. 如果数组包含重复项,它是否有效?
2. 它会不会比我的第二个apporach好吗?
我想知道是否存在任何O(logn)解决方案?
答案 0 :(得分:8)
这是一个O(kLogN)解决方案:
使用二进制搜索的变体来查找给定值的最后一次出现,
答案 1 :(得分:5)
k - 最小元素似乎有两种不同的解释。我假设它意味着“ k - 最小元素,忽略重复。”
最好的解决方案是O(n)时间和O(1)空间,正如您在方法2中描述的那样。我们可以证明这一点。
¹在两个非相邻数组元素具有相同值的特殊情况下,可以推断排序数组的任意长子序列的值:所有临时元素必须共享该值。但这不是一个典型的案例,所以我忽略了它。