在未排序的數組中找到第 k 個最大的元素。請注意,你需要找的是數組排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
示例 1:
輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
示例 2:
輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4
說明:
你可以假設 k 總是有效的,且 1 ≤ k ≤ 數組的長度。
思路:
- 第K大 = 第N-K小
- 快排優化
private int[] nums;
public int findKthLargest(int[] nums, int k) {
this.nums = nums;
int len = nums.length;
return quickSort(0, len - 1, len - k);
}
public int quickSort(int left, int right, int smallest) {
if (left == right) return nums[left];
Random random = new Random(); // 隨機獲取index值
int parIndex = left + random.nextInt(right - left);
parIndex = partition(left, right, parIndex); // 劃分後的parIndex
if (parIndex == smallest) { // 第smallest小的已經拍好了
return nums[parIndex];
} else if (smallest < parIndex) { // 往左邊
return quickSort(left, parIndex - 1, smallest);
} else {
return quickSort(parIndex + 1, right, smallest);
}
}
private int partition(int left, int right, int parIndex) {
int par = this.nums[parIndex];
swap(parIndex, right); // 分割點放在最右側
int storeIndex = left;
for (int i = left; i <= right; i++) { // 小於分割點的都放在左側
if (nums[i] < par) {
swap(storeIndex++, i);
}
}
swap(storeIndex, right); // 分割點歸位
return storeIndex;
}
private void swap(int a, int b) {
int tmp = nums[b];
nums[b] = nums[a];
nums[a] = tmp;
}