题目分析
暴力求解是直接使用sort(库函数排序,默认也是快排)直接将数组排序好,然后直接用index,时间复杂度为O(nlogn)
由于题目有时间限制,则要进行时间优化,那就是利用快排的思想可以做到时间复杂度达到O(n)
实现思路
快排的实现是随机选择一个基数(一般选用第1个),将比基数小的移动到左边,比基数大的移动到右边。然后再接着递归左边和右边,最后将数组排序好。
本题目实现思路是,选用同样的基数,将比基数小的移动到左边、比基数大的移动到右边,然后的判断基数最终所在位置(因为基数所在为和排序好位置不变),如果基数大于k,则递归左边,反之递归右边。直至k的值和基数重合
实现代码如下(经过快排的小改动)
int k;
static void swap(int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public int findKthLargest(int[] nums, int k) {
this.k = nums.length - k;
QSort(nums,0,nums.length-1);
return nums[this.k];
}
void QSort(int[] a, int left, int right){
if(left < right){
int low = left;
int high = right+1;
int pivot = a[low];
while(low < high){
while(low < right && a[++low] <= pivot);
while (high > left && a[--high] >= pivot);
if(low < high) swap(a, low, high);
}
swap(a,left,high);
System.out.println(low+" "+high);
if(high == k) return;
if (high > k) QSort(a, left, high-1);
else QSort(a, high+1, right);
}
}