题目:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
考察对排序算法的掌握。
快排
class Solution {
public int findKthLargest(int[] nums, int k) {
sort1(nums,0,nums.length-1);
k=nums.length-k;
return nums[k];
}
private void sort1(int[]num,int left,int right){
if(left>=right) return;//
int key=num[left];
int i=left;
int j=right;
while(i<j){
//while(j)写在前面,并使用>能保证一个while循环后的key所在位置后面的都是比他大的,前面为小于等于他。
//找到一个左边的大的数和右边的小的树进行交换;
//寻找的时候有三种情况:
//因为设定是从右边开始,当倒数第二次交换完毕后。
//(1)两者之间只有小的数,没有大的数:此时j找到一个小的数,j=j-1,停止,i想要寻找一个大的数来作为交换,两者中间已经没有大的数了
// 只有,小于等于KEY值的,故此时i++一直到i=j;故此时把KEY值从左边换到当前位置
//(2)两只之间只有大的数,没有小的数:此时j--,欲找到一个小的数,不过找不到
// 直到j=i,此时把key值从左端与此交换
//(3)此时,两者之间没有数了,j寻找,j--,j=i;
while(num[j]>key&& i<j){
j--;
}
while(num[i]<=key&& i<j){ //<=要注意
i++;
}
//分成两段,左边大,右边小
if(i<j){
int temp;
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
//确认分段点后,把左端的值移过来
num[left]=num[j];
num[j]=key;
//其实每次调用就确定了一个数据的位置num[i];
sort1(num,left,i-1);
sort1(num,i+1,right);
}
}