[LeetCode] Kth Largest Element in an Array (找出数组的第k大的元素)

来源:互联网 发布:建筑设计模型制作软件 编辑:程序博客网 时间:2024/05/17 03:19

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

For example,
Given [3,2,1,5,6,4] and k = 2, return 5.

Note: 
You may assume k is always valid, 1 ≤ k ≤ array's length.


方法一:

一看这题,可能第一个想到的就是使用排序算法,但是如果使用排序算法,再找出nums[nums.size()-k]的元素,那么复杂度将会是O(NlogN),如果在数据比较小的情况下可能是能过,但这题很显然不会让你两行代码(sort,returnnums[nums.size()-k])结束该题,所以肯定会超时的


方法二:

使用二分法,可以使复杂度降低到O(N),类似于快排,但我们并不需要进行排序。首先取序列中的首元素p,把该序列中比p小的元素放在左边,比p大的元素放在右边.然后根据更新后p在序列中的位置,可以推出第k大的元素在左边还是右边。若在左边,则进行同样的操作,在右边也进行同样的操作。直到p的位置刚刚好在第k大的位置,此时就可返回p,即为答案。

复杂度分析:

每次操作都要进行n次比较,这里的n的序列长度。假设每次取到的元素恰好在中间位置,则每次序列长度减半。所以总共最多需要比较n+n/2+n/4+.....1=n(1+1/2+1/4+....(1/2)^k)≤2n,所以复杂度为O(N)



0 0