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

GDY5發表於2016-09-04

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]


相關文章