题解 | #最长无重复子数组#
寻找第K大
http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf
快排 + 二分(每次只取k所在范围进行快排)
import java.util.*;
public class Solution {
public int findKth(int[] a, int n, int K) {
// write code here
return find(a , 0 , n - 1, K);
}
//分治。每次只取包含k的范围进行快排定位
public int find(int[] a, int low, int high, int K){
int pivot = partition(a, low, high);
if(pivot + 1 < K){
return find(a, pivot + 1, high, K);
}else if(pivot + 1 > K){
return find(a, low, pivot - 1, K);
}else{
return a[pivot];
}
}
// 快排定位。从最右开始和基准进行比较,直到遇到比基准小的,和左侧的left进行交换。
// 从左侧的位置开始向右比较,直到遇到比基准大的,和右侧的right进行交换。
// 最后输出基准数字所在位置。
public int partition(int[] a, int low, int high){
int pivotValue = a[low];
while(low < high){
while(low < high && a[high] <= pivotValue){
high--;
}
a[low] = a[high];
while(low < high && a[low] >= pivotValue){
low++;
}
a[high] = a[low];
}
a[low] = pivotValue;
return low;
}
}