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,return nums[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)
class Solution {
public:
int findKthLargest(vector
& nums, int k) {
int begin=0,end=nums.size()-1;
while(begin<=end)
{
int pivot=nums[begin],pt=begin,p1=begin;
for(int i=begin+1;i<=end;++i)
if(nums[i]