文章目录
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.
直接排序 O ( n log n ) + O ( 1 ) O(n\log n)+O(1) O(nlogn)+O(1)
Java
class Solution {
public int findKthLargest(int[] nums, int k) {
int n=nums.length;
Arrays.sort(nums);
return nums[n-k];
}
}
???
C++
class Solution {
public:
int findKthLargest(vector<int>& a, int k) {
int n=a.size();
sort(a.begin(),a.end());
return a[n-k];
}
};
Python
class Solution:
def findKthLargest(self, a: List[int], k: int) -> int:
return sorted(a)[len(a)-k]
Go
func findKthLargest(nums []int, k int) int {
sort.Slice(nums, func(i,j int)bool{
return nums[i]>nums[j]
})
return nums[k-1]
}
最大堆/最小堆 O ( n log k ) + O ( k ) O(n\log k)+O(k) O(nlogk)+O(k)
Java
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> pq=new PriorityQueue<>();
for(int v:nums){
pq.offer(v);
if(pq.size()>k)
pq.poll();
}
return pq.peek();
}
}
C++
class Solution {
public:
int findKthLargest(vector<int>& a, int k) {
priority_queue<int, vector<int>, greater<int>> pq;
for(int v:a){
pq.push(v);
if(pq.size()>k)pq.pop();
}
return pq.top();
}
};
Python
class Solution:
def findKthLargest(self, a: List[int], k: int) -> int:
h=[]
for v in a:
heapq.heappush(h,v)
if len(h)>k:
heapq.heappop(h)
return heapq.heappop(h)
Go
func findKthLargest(nums []int, k int) int {
pq:=MinHeap(nums)
heap.Init(&pq)
for pq.Len() > k{
heap.Pop(&pq)
}
return heap.Pop(&pq).(int)
}
type MinHeap []int
func (h MinHeap) Len() int {return len(h)}
func (h MinHeap) Less(i,j int) bool {return h[i]<h[j]}
func (h MinHeap) Swap(i,j int) {h[i],h[j]=h[j],h[i]}
func (h *MinHeap) Push(x interface{}){
*h=append(*h,x.(int))
}
func (h *MinHeap) Pop() interface{}{
n:=(*h)[len(*h)-1]
*h=(*h)[:len(*h)-1]
return n
}
Partitation O ( n ) ∼ O ( n 2 ) + O ( 1 ) O(n)\sim O(n^2)+O(1) O(n)∼O(n2)+O(1)
Java
class Solution {
public int findKthLargest(int[] a, int k) {
int n=a.length;
int l=0,r=n-1;
k=n-k;
while(l<r){
int p=part(a,l,r);
if(p<k)l=p+1;
else if(p>k)r=p-1;
else break;
}
return a[k];
}
public int part(int[] a,int l,int r){
int i=l,pivot=a[r];
for(int j=l;j<r;j++)
if(a[j]<=pivot)
swap(a,i++,j);
swap(a,i,r);
return i;
}
public void swap(int[] a,int i,int j){
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
C++
class Solution {
public:
int findKthLargest(vector<int>& a, int k) {
int n=a.size();
int l=0,r=n-1;
k=n-k;
while(l<r){
int p=part(a,l,r);
if(p>k)r=p-1;
else if(p<k)l=p+1;
else break;
}
return a[k];
}
int part(vector<int>& a,int l,int r){
int pivot=a[r],i=l;
for(int j=l;j<r;j++){
if(a[j]<=pivot)
swap(a[i++],a[j]);
}
swap(a[i],a[r]);
return i;
}
};
- partition 的写法有很多
class Solution {
public:
int findKthLargest(vector<int>& a, int k) {
int n=a.size();
int l=0,r=n-1;
k=n-k;
while(l<r){
int p=part(a,l,r);
if(p>k)r=p-1;
else if(p<k)l=p+1;
else break;
}
return a[k];
}
int part(vector<int>& a,int l,int r){
int i=l+1,j=r,m=a[l];
while(true){
while(i<r&&a[i]<m)i++;
while(j>l&&a[j]>=m)j--;
if(i<j)
swap(a[i],a[j]);
if(i>=j)break;
}
swap(a[l],a[j]);
return j;
}
};
- 改下 pivot 的位置:
class Solution {
public:
int findKthLargest(vector<int>& a, int k) {
int n=a.size();
int l=0,r=n-1;
k=n-k;
while(l<r){
int p=part(a,l,r);
if(p>k)r=p-1;
else if(p<k)l=p+1;
else break;
}
return a[k];
}
int part(vector<int>& a,int l,int r){
int pivot=a[l],i=l+1;
for(int j=l+1;j<=r;j++)
if(a[j]<=pivot)
swap(a[j],a[i++]);
swap(a[i-1],a[l]);
return i-1;
}
};
Python
class Solution:
def findKthLargest(self, a: List[int], k: int) -> int:
n=len(a)
l,r=0,n-1
k=n-k
while l<r:
p=self.part(a,l,r)
if p>k:
r=p-1
elif p<k:
l=p+1
else:
break
return a[k]
def part(self, a, l, r):
i,pivot=l,a[r]
for j in range(l,r):
if a[j]<=pivot:
a[i],a[j]=a[j],a[i]
i+=1
a[i],a[r]=a[r],a[i]
return i
Go
func findKthLargest(a []int, k int) int {
n:=len(a)
l,r:=0,n-1
k=n-k
for l<r{
p:=part(a,l,r)
if p>k{
r=p-1
} else if p<k{
l=p+1
} else {
break
}
}
return a[k]
}
func part(a []int, l,r int)int{
i,pivot:=l,a[r]
for j:=l;j<r;j++{
if a[j]<=pivot{
a[j],a[i]=a[i],a[j]
i++
}
}
a[i],a[r]=a[r],a[i]
return i
}
QuickSelect O ( n ) ∼ O ( n 2 ) + O ( 1 ) O(n)\sim O(n^2)+O(1) O(n)∼O(n2)+O(1)
- 和上一个方法本质其实是一样的
Java
class Solution {
public int findKthLargest(int[] a, int k) {
return qs(a,0,a.length-1,k);
}
public int qs(int[] a,int l,int r,int k){
int i=l,pivot=a[r];
for(int j=l;j<r;j++)
if(a[j]<=pivot)
swap(a,i++,j);
swap(a,i,r);
int c=r-i+1;
if(c==k)return a[i];
if(c>k)return qs(a,i+1,r,k);
return qs(a,l,i-1,k-c);
}
public void swap(int[] a,int i,int j){
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
C++
class Solution {
public:
int findKthLargest(vector<int>& a, int k) {
return qselect(a,0,a.size()-1,k);
}
int qselect(vector<int>& a,int l,int r,int k){
int i=l,pivot=a[r];
for(int j=l;j<r;j++)
if(a[j]<=pivot)
swap(a[j],a[i++]);
swap(a[i],a[r]);
int c=r-i+1;
if(c==k)return a[i];
if(c>k)return qselect(a,i+1,r,k);
return qselect(a,l,i-1,k-c);
}
};
Python
class Solution:
def findKthLargest(self, a: List[int], k: int) -> int:
return self.qs(a,0,len(a)-1,k)
def qs(self, a, l, r, k):
i,pivot=l,a[r]
for j in range(l,r):
if a[j]<=pivot:
a[j],a[i]=a[i],a[j]
i+=1
a[i],a[r]=a[r],a[i]
c=r-i+1
if c==k:
return a[i]
if c>k:
return self.qs(a,i+1,r,k)
return self.qs(a,l,i-1,k-c)
Go
func findKthLargest(a []int, k int) int {
return qs(a,0,len(a)-1,k)
}
func qs(a []int, l,r,k int)int{
i,pivot:=l,a[r]
for j:=l;j<r;j++{
if a[j]<=pivot{
a[j],a[i]=a[i],a[j]
i++
}
}
a[i],a[r]=a[r],a[i]
c:=r-i+1
if c==k{
return a[i]
}
if c>k{
return qs(a,i+1,r,k)
}
return qs(a,l,i-1,k-c)
}