461. 無序數組K小元素

lintcode題目
難度:中等
類型:分治
題意:求出數組第k小的數,可以使用優先隊列,也可以使用快排。按照快排的思路,先尋找分割點,然後講分割點兩邊的數據滿足左邊小於關鍵字,右邊大於關鍵字,然後統計左邊的數量left和k的相對大小,如果左邊的數量比k大,說明第k小的數,一定在左邊,所以直接求左邊,反之在右邊。
時間複雜度:堆O(nlgnO(nlgn) 快排O(n)O(n)

class Solution {
public:
    /**
     * @param k: An integer
     * @param nums: An integer array
     * @return: kth smallest element
     */
     int quick(int l, int r, vector<int>& nums, int k){
         if(l == r) return nums[l];
         int x = nums[l+r>>1];
         int i = l-1, j = r+1;
         while(i < j){
             while(nums[++i] < x);
             while(nums[--j] > x);
             if(i < j) swap(nums[i], nums[j]);
         }
         int left = j - l + 1;
         if(left >= k) return quick(l, j, nums, k);
         else return quick(j+1, r, nums, k-left);
     }
    int kthSmallest(int k, vector<int> &nums) {
       //快速排序
       int l = 0, r = nums.size()-1;
       return quick(l, r, nums, k);
       
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章