题目: 查找(无序)数组中第K大的元素 == > O(n)
思路:
1. 快排的时候,partition() == > 返回的就是某个元素的位置
通过比较这个元素idx 与 待查找元素的idx , 缩小查找范围
public class Solution {
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
// 排好序 该元素在数组中位置
int idx = len - k;
return divide(nums , idx , 0 , len - 1);
}
int divide(int[] nums , int idx , int low , int high) {
if(low == high) return nums[low];
int pivot = partition(nums , low , high);
if(pivot == idx) return nums[pivot];
if(pivot < idx) return divide(nums, idx , pivot + 1, high);
return divide(nums, idx , low , pivot - 1);
}
int partition(int[]nums , int low , int high) {
int i = low , j = low + 1;
int key = nums[i];
for( ; j <= high ;) {
if(nums[j] >= key) j++;
else {
swap(nums, i+1 , j);
i++;
j++;
}
}
swap(nums , i , low);
return i;
}
void swap(int[] nums , int t , int p) {
int tmp = nums[t];
nums[t] = nums[p];
nums[p] = tmp;
}
}