- Kth Smallest Numbers in Unsorted Array
中文English
Find the kth smallest number in an unsorted integer array.
Example
Example 1:
Input: [3, 4, 1, 2, 5], k = 3
Output: 3
Example 2:
Input: [1, 1, 1], k = 2
Output: 1
Challenge
An O(nlogn) algorithm is acceptable, if you can do it in O(n), that would be great.
解法1:用最大堆。
这个方法很慢。时间复杂度O(nlogk)。pq总共push了n次,pop了n-k次。
class Solution {
public:
/**
* @param k: An integer
* @param nums: An integer array
* @return: kth smallest element
*/
int kthSmallest(int k, vector<int> &nums) {
int n = nums.size();
if (n < k) return -1;
priority_queue<int> pq; //max-heap
for (int i = 0; i < n; ++i) {
pq.push(nums[i]);
if (i >= k) pq.pop();
}
return pq.top();
}
};
解法2:还是max-heap。时间复杂度O(nlogk)。
代码如下:
class Solution {
public:
/**
* @param k: An integer
* @param nums: An integer array
* @return: kth smallest element
*/
int kthSmallest(int k, vector<int> &nums) {
int n = nums.size();
if (n < k) return -1;
priority_queue<int> pq; //max-heap
for (int i = 0; i < n; ++i) {
if (i < k) {
pq.push(nums[i]);
} else {
if (nums[i] < pq.top()) {
pq.push(nums[i]);
pq.pop();
}
}
}
return pq.top();
}
};
解法2比解法1效率高。因为是最大堆,那么nums[i]>pq.top()的话,push进去了就会马上pop出来,等于什么也没干。
解法3:QuickSelect。时间复杂度O(n)。
代码如下:
class Solution {
public:
/**
* @param k: An integer
* @param nums: An integer array
* @return: kth smallest element
*/
int kthSmallest(int k, vector<int> &nums) {
int n = nums.size();
if (n == 0 || n < k) return -1;
return quickSelect(nums, k, 0, n - 1);
}
private:
int quickSelect(vector<int> & nums, int k, int start, int end) {
if (start >= end) return nums[start];
int left = start, right = end;
int pivot = nums[(left + right) / 2];
while(left <= right) {
while(left <= right && nums[left] < pivot) left++;
while(left <= right && nums[right] > pivot) right--;
if (left <= right) { // do not miss this line
swap(nums[left], nums[right]);
left++;
right--;
}
}
if (start + k - 1 <= right) return quickSelect(nums, k, start, right);
if (start + k - 1 >= left) return quickSelect(nums, k - (left - start), left, end);
return nums[right + 1];
}
};
解法4:QuickSelect循环版本。TBD。