leetcode 215. Kth Largest Element in an Array (数组中的第 k 个最大元素)

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(nlogn)+O(1)O(n\log n)+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(nlogk)+O(k)O(n\log k)+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(n2)+O(1)O(n)\sim O(n^2)+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(n2)+O(1)O(n)\sim O(n^2)+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)
}
posted @ 2020-08-13 16:53  winechord  阅读(145)  评论(0编辑  收藏  举报