题解 | #寻找第K大#
寻找第K大
https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf?tpId=190&&tqId=35209&rp=1&ru=/activity/oj&qru=/ta/job-code-high-rd/question-ranking
我骄傲了,第一次写题解
总的思想就是,每一次快排后参考值的位置对于完全有序的数组来说就已经确定了,判断参考值位置在目标位置的左边还是右边或者相等。
如果参考值位置在目标位置的左边,说明参考值小于目标值,则需要对参考值右部分进行快排重新获取位置
如果参考值位置在目标位置的右边,说明参考值大于目标值,则需要对参考值左部分进行快排重新获取位置
相等则返回
public class Solution {
//一次快排后参考值位置就已经确定了,判断这个位置是否等于给定值
//如果小于则对右边部分快排,大于则对左边部分快排
public int findKth(int[] a, int n, int K) {
// write code here
if(a==null||a.length==0){
return 0;
}
int left = 0;
int right = n-1;
//转换一下,第k大的元素索引为n-k
int target = n-K;
while(true){
int index = getIndex(a,left,right);
if(index == target){
return a[index];
}else if(index<target){
left = index+1;//对右边进行快排
}else{
right = index-1;//对左边进行快排
}
}
}
//快排获取参考值位置
public int getIndex(int[] arr,int left,int right){
int i = left,j = right;
int base = arr[left];//参考值
while(i<j){
//从右边开始找,找到第一个小于参考值的数
while(arr[j]>=base&&i<j){
j--;
}
//从左边开始找,找到第一个大于参考值的数
while(arr[i]<=base&&i<j){
i++;
}
//找到后交换这两个数
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
arr[left] = arr[j];
arr[j] = base;//参考值的位置就在j处
return j;
}
}