无序数组K小元素
题目:
描述
找到一个无序数组中第K小的数
样例
样例 1:
输入: [3, 4, 1, 2, 5], k = 3
输出: 3
样例 2:
输入: [1, 1, 1], k = 2
输出: 1
解题思路:和数组中的第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
quickSelect(nums, 0, nums.length - 1, k - 1);
return nums[k - 1];
}
private void quickSelect(int[] nums, int l, int r, int k) {
if(l > r) {
return ;
}
int idx = part(nums, l, r);
if(idx == k) {
return ;
} else if(idx > k){
quickSelect(nums, l, idx - 1, k);
} else {
quickSelect(nums, idx + 1, r, k);
}
}
private int part(int[] nums, int l, int r) {
int i = l, j = r;
int cur = nums[l];
while(i < j) {
while(i < j && nums[j] >= cur) {
j--;
}
while(i < j && nums[i] <= cur) {
i++;
}
if(i < j) {
swap(nums, i, j);
}
}
swap(nums, l, i);
return i;
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}