快速排序-无序数组K小元素
13:07:382020-03-10 11:16:13
问题描述:
找到一个无序数组中第K小的数
样例 1:
输入: [3, 4, 1, 2, 5], k = 3
输出: 3
样例 2:
输入: [1, 1, 1], k = 2
输出: 1
挑战
O(nlogn)的算法固然可行, 但如果你能 O(n) 解决, 那就非常棒了.
问题求解:
使用快速排序可以在O(n)的时间复杂度求解。
时间复杂度: O(n + n / 2 + n / 4 + ... + 1) = O(2 * n)
public int kthSmallest(int k, int[] nums) { int n = nums.length; int idx = helper(nums, 0, n - 1); while (idx != k - 1) { if (idx > k - 1) idx = helper(nums, 0, idx - 1); else idx = helper(nums, idx + 1, n - 1); } return nums[idx]; } private int helper(int[] nums, int start, int end) { int key = nums[start]; int i = start; for (int j = start + 1; j <= end; j++) { if (nums[j] <= key) { int temp = nums[i + 1]; nums[i + 1] = nums[j]; nums[j] = temp; i += 1; } } nums[start] = nums[i]; nums[i] = key; return i; }