题目描述

题解
class Solution {
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length - k];
}
}
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
for (int num: nums) {
if (minHeap.isEmpty())
minHeap.add(num);
else if (minHeap.size() < k)
minHeap.add(num);
else if (minHeap.size() >= k && num > minHeap.peek()) {
minHeap.poll();
minHeap.add(num);
}
}
return minHeap.peek();
}
}
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
for (int num: nums) {
if (minHeap.size() < k)
minHeap.add(num);
else if (minHeap.size() >= k && num > minHeap.peek()) {
minHeap.poll();
minHeap.add(num);
}
}
return minHeap.peek();
}
}
// 快排选择法
// 将nums.length - k赋给kth,我们不需要所有nums元素进行排序,
// 只需要选择nums前nums.length - k个元素进行排序,然后取到nums.length - k
// 即可。将nums.length - k记为kth。直接把快排的partition写进来,swap写进来,
// 重写快排递归函数quickSortSelect,partition求得的mid,再次递归之前进行判定
// ,如果mid和kth相等,则直接将arr[mid]赋值给res,之后结束递归,返回结果res。
// 如果mid小于kth,则mid还需要右移,递归调用,令left为mid+1,
// 如果mid大于等于kth,则说明mid还需要左移,递归调用,令right为mid-1。
// 当mid等于kth时,排序完成,令res等于arr[mid]。直接返回res即可。
//
// 执行用时:10 ms, 在所有 Java 提交中击败了29.98%的用户
// 内存消耗:38.9 MB, 在所有 Java 提交中击败了29.90%的用户
public class Solution {
int kth
int res = 0
public int findKthLargest(int[] nums, int k) {
this.kth = nums.length - k
quickSortSelect(nums, 0, nums.length - 1)
return res
}
private void quickSortSelect(int[] arr, int left, int right) {
int mid = partition(arr, left, right)
if (mid == kth)
res = arr[mid]
else if (mid < kth)
quickSortSelect(arr, mid + 1, right)
else
quickSortSelect(arr, left, mid - 1)
return
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[left]
int l = left
int r = right
while (l < r) {
while (l <= r && arr[l] <= pivot)
l++
while (l <= r && arr[r] >= pivot)
r--
if (l < r)
swap(arr, l, r)
}
arr[left] = arr[r]
arr[r] = pivot
return r
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
// 减少递归的修改
// 执行用时:10 ms, 在所有 Java 提交中击败了29.98%的用户
// 内存消耗:38.6 MB, 在所有 Java 提交中击败了78.18%的用户
public class Solution {
int kth
int res = 0
public int findKthLargest(int[] nums, int k) {
this.kth = nums.length - k
quickSortSelect(nums, 0, nums.length - 1)
return res
}
private void quickSortSelect(int[] arr, int left, int right) {
while (true) {
int mid = partition(arr, left, right)
if (mid == kth) {
res = arr[mid]
break
}
else if (mid < kth)
left = mid + 1
else
right = mid - 1
}
}
private static int partition(int[] arr, int left, int right) {
int pivot = arr[left]
int l = left
int r = right
while (l < r) {
while (l <= r && arr[l] <= pivot)
l++
while (l <= r && arr[r] >= pivot)
r--
if (l < r)
swap(arr, l, r)
}
arr[left] = arr[r]
arr[r] = pivot
return r
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}