题目描述:就是在数组中找到第k大的数
(1)第一种方法就是利用sort函数排序
时间复杂度 O(NlogN),空间复杂度 O(1)
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length - k];
}
(2)第二种方法是维护一个K大小的小根堆
这样就可以始终保证K大小的小根堆中,堆顶是最小值,我们最后返回这个堆顶就可以了
其中使用的是优先级队列,关于优先级队列的介绍和怎么表示一个堆以及怎么插入和删除调整一个堆,在下面连接中
https://www.cnblogs.com/Elliott-Su-Faith-change-our-life/p/7472265.html
代码
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue <Integer> pq= new PriorityQueue<>();//java默认是一个小根堆
for(int val:nums){
pq.add(val);
if(pq.size()>k){
pq.poll();
}
}
return pq.peek();
}
}
(3)第三种方法是快速选择 时间复杂度 O(N),空间复杂度 O(1)
这种方法是复制的别人的代码,并没有仔细看
class Solution {
public int findKthLargest(int[] nums, int k) {
int begin=0;
int end=nums.length-1;
k=nums.length+1-k;
while(begin<end){
int pos=partition(nums,begin,end);
if(pos==k-1) break;
else if(pos<k-1) begin=pos+1;
else end=pos-1;
}
return nums[k-1];
}
public int partition(int[]nums,int l,int r){
int less=l-1;//小于区的下标
int more=r;//大于区的下标,默认以最后一个下标的数作为划分值
while(l<more){
if(nums[l]<nums[r])
swap(nums,++less,l++);
else if (nums[l]>nums[r])
swap(nums,--more,l);
else l++;
}
swap(nums,more,r);
return less+1;//小于区位置+1可以得到划分的这个数的下标
}
private void swap(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}