题目地址:
https://www.lintcode.com/problem/kth-smallest-numbers-in-unsorted-array/description
给定一个未排序的数组,求其第 k k k小元素。
经典的Quick Select算法。先利用快排的partition操作,确定一个数的位置,然后看其位置与 k k k的关系,接着向答案存在的一边进行寻找即可。代码如下:
public class Solution {
/**
* @param k: An integer
* @param nums: An integer array
* @return: kth smallest element
*/
public int kthSmallest(int k, int[] nums) {
// write your code here
int l = 0, r = nums.length - 1, pos = 0;
while ((pos = partition(nums, l, r)) != k - 1) {
if (pos < k - 1) {
l = pos + 1;
} else {
r = pos - 1;
}
}
return nums[pos];
}
private int partition(int[] nums, int l, int r) {
int m = l + (r - l >> 1);
swap(nums, l, m);
int pivot = nums[l];
int i = l, j = r;
while (i < j) {
while (i < j && pivot <= nums[j]) {
j--;
}
nums[i] = nums[j];
while (i < j && nums[i] <= pivot) {
i++;
}
nums[j] = nums[i];
}
nums[i] = pivot;
return i;
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
平均时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。