215. Kth Largest Element in an Array(快排的分治思想)

来源:互联网 发布:云软件哪个好 编辑:程序博客网 时间:2024/04/29 08:42

题意:

给你一个无序的数组,让你求第k大元素;

思路:

比较简单的是利用最小堆(优先队列)保存前k大的元素,最后返回堆顶即可。还有一种方法是利用快排分治的方法,判断每次确定的键值是不是所求的元素;

是的话结束递归返回答案,

不是的话:

1.键值是第x大元素(x>k),此时所求元素在键值的右边,继续在右边区间递归。

2.键值是第x大元素(x<k),此时所求元素在键值的左边,继续在左边区间递归(注意修改k的值,k的值应改为k-x);

java代码:

class Solution {    public int findKthLargest(int[] nums, int k) {        return QuickSelect(nums,0,nums.length-1,k);    }    public int QuickSelect(int[] nums, int s, int e,int k){        int temp = nums[s];        int l = s;        int r = e;        while(l<r){            while(l<r&&nums[r]>=temp){                r--;            }            nums[l] = nums[r];            while(l<r&&nums[l]<=temp){                l++;            }            nums[r] = nums[l];        }        nums[l] = temp;        if(e-l+1==k){            return nums[l];        }        else if(e-l+1>k){            return QuickSelect(nums,l+1,e,k);        }        else{            return QuickSelect(nums,s,l-1,k-e+l-1);        }    }}