题解 | #最长无重复子数组#
寻找第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; } }