这可能是微软的面试题。给定一个有序数组,找出第k小的元素(忽略重复项)。
[编辑]:数组可能包含重复项(未指定)。
思考了很多次,但仍在质疑自己:还存在更好的解决方案吗?
现在,当一个新元素比堆头小时,用这个新元素替换堆头并进行堆化。最后,如果堆的大小为k,则堆的头表示第k个最小元素,否则第k个最小元素不存在。
时间复杂度:O(NlogK)
空间复杂度:O(K)
时间复杂度:O(N)
空间复杂度:O(1)
这里有两个问题:
1. 如果数组包含重复项,它是否有效?
2. 比我的第二种方法更好吗?
我在想是否存在O(logn)的解决方案?
[编辑]:数组可能包含重复项(未指定)。
思考了很多次,但仍在质疑自己:还存在更好的解决方案吗?
方法1:
使用最大堆并插入前k个唯一元素[可以轻松检查]。然后进行堆化。现在,当一个新元素比堆头小时,用这个新元素替换堆头并进行堆化。最后,如果堆的大小为k,则堆的头表示第k个最小元素,否则第k个最小元素不存在。
时间复杂度:O(NlogK)
空间复杂度:O(K)
方法2 [更好的方法]:
元素可能会重复。因此,通过与其前一个元素进行比较来检查唯一元素,并在到达k个唯一变量时停止。时间复杂度:O(N)
空间复杂度:O(1)
方法3 [更好的方法(也许)]:
可以使用修改过的快速排序分区算法的版本。但是,由于数组已经排序,所以可能会导致最坏情况。这里有两个问题:
1. 如果数组包含重复项,它是否有效?
2. 比我的第二种方法更好吗?
我在想是否存在O(logn)的解决方案?
前k个唯一元素[可以轻松检查]
的详细信息。 - greybeard