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