leetcode [215]Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
Example 1:
Input: [3,2,1,5,6,4] and k = 2
Output: 5
Example 2:
Input: [3,2,3,1,2,4,5,5,6] and k = 4
Output: 4
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
题目大意:
找到数组中第k大的数字
解法:
采用快排的思想对数组进行排序,当返回下标是k-1时,这时数组上第k-1个位置就是第k大的数字。
java:
class Solution {
int paritition(int[] nums,int start,int end,int k){
if(start==end) return start;
int small=start-1;
for(int i=start;i<end;i++){
if(nums[i]>nums[end]){
small++;
int tmp=nums[i];
nums[i]=nums[small];
nums[small]=tmp;
}
}
small++;
int tmp=nums[end];
nums[end]=nums[small];
nums[small]=tmp;
return small;
}
public int findKthLargest(int[] nums, int k) {
int start=0,end=nums.length-1;
int index=paritition(nums,start,end,k);
while (index+1!=k){
if(index+1<k) start=index+1;
else end=index-1;
index=paritition(nums,start,end,k);
}
return nums[k-1];
}
}
优化了一下代码,将选取基准元素变为随机选取,效率提升了很多。
java:
class Solution {
private int paritition(int[] nums,int start,int end,int k){
if(start==end) return start;
Random r=new Random();
int index=r.nextInt(end-start+1)+start;
swap(nums,end,index);
int small=start-1;
for(int i=start;i<end;i++){
if(nums[i]>nums[end]){
small++;
swap(nums,i,small);
}
}
small++;
swap(nums,end,small);
return small;
}
private void swap(int[] nums,int i1,int i2){
int tmp=nums[i1];
nums[i1]=nums[i2];
nums[i2]=tmp;
}
public int findKthLargest(int[] nums, int k) {
int start=0,end=nums.length-1;
int index=paritition(nums,start,end,k);
while (index+1!=k){
if(index+1<k) start=index+1;
else end=index-1;
index=paritition(nums,start,end,k);
}
return nums[k-1];
}
}
也可以维护一个大小为k的最小堆,当当前元素大于最小堆的堆顶时,将堆顶元素删除,并且将当前元素加入到堆中,重新调整堆,最后的堆顶元素则是第k大的元素。
最小堆解法:
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer>p=new PriorityQueue<>(k);
int i=0;
for (;i<k;i++){ p.add(nums[i]); }
while (i<nums.length){
if (p.peek()<nums[i]){
p.poll();
p.add(nums[i]);
}
i++;
}
return p.peek();
}
}

浙公网安备 33010602011771号