
方法1: sort。时间复杂nlogn,空间复杂1.
class Solution {
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length-k];
}
}
方法2: heap。时间复杂nlogk,空间复杂k。
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<Integer>();
for(int num : nums){
heap.offer(num);
if(heap.size() > k) heap.poll();
}
return heap.poll();
}
}
方法3: quick select。这个方法其实和快速排序还是挺像的,但是快排时间复杂nlogn,但是quick select时间复杂n。具体解释直接看lc官方解答3,讲地很清楚。
class Solution {
int[] nums;
public void swap(int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
public int partition(int left, int right, int pivot_index){
int pivot = nums[pivot_index];
swap(pivot_index, right);
int store_index = left;
for(int i = left; i <= right; i++){
if(nums[i] < pivot){
swap(store_index, i);
store_index++;
}
}
swap(store_index, right);
return store_index;
}
public int quickSelect(int left, int right, int k_smallest){
if(left == right) return nums[left];
Random random = new Random();
int pivot_index = left + random.nextInt(right - left);
pivot_index = partition(left, right, pivot_index);
if(k_smallest == pivot_index)
return nums[k_smallest];
else if(k_smallest < pivot_index)
return quickSelect(left, pivot_index - 1, k_smallest);
return quickSelect(pivot_index + 1, right, k_smallest);
}
public int findKthLargest(int[] nums, int k) {
this.nums = nums;
int size = nums.length;
return quickSelect(0, size - 1, size - k);
}
}
本文介绍了三种不同的算法来寻找数组中的第K大元素:排序、堆和快速选择。通过对比不同方法的时间和空间复杂度,帮助读者理解各种算法的特点及其适用场景。
880

被折叠的 条评论
为什么被折叠?



