题意以及限制条件
-
题目:
-
限制条件:You may assume k is always valid, 1 ≤ k ≤ array’s length.
想到的所有可能解法
-
Ways_1——QuickSelect
- 平均时间复杂度——O(n);空间复杂度——O(1);
- 最坏时间复杂度——O( n 2 n^2 n2)。
对应的代码
- Ways_1
class Solution {
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
return quickSelect(nums, 0, len - 1, len - k);
}
private static int quickSelect(int[] nums, int begin, int end, int k) {
if (end <= begin) return nums[begin];
int pivot = partition(nums, begin, end);
if (k == pivot) {
return nums[pivot];
} else if (k < pivot) {
return quickSelect(nums, begin, pivot - 1, k);
} else {
return quickSelect(nums, pivot + 1, end, k);
}
}
private static int partition(int[] nums, int begin, int end) {
// int pivot = nums[end];
int pivot = nums[(int) (Math.random() * (end - begin + 1) + begin)];
int i = begin, j = end;
while (i < j) {
while (nums[i] < pivot) ++i;
while (nums[j] > pivot) --j;
if (i < j) swap(nums, i, j);
if (nums[i] == nums[j] && i != j) ++i;
}
return i;
}
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}