堆或快排
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
if (n < k) return -1;
for (int i = (k-2)/2; i >= 0; i--) {
sink(nums, i, k-1);
}
for (int i = k; i < n; i++) {
if (nums[i] > nums[0]) {
exch(nums, 0, i);
sink(nums, 0, k-1);
}
}
return nums[0];
}
private void sink(int[] a, int k, int n) {
while (2 * k + 1 <= n) {
int j = 2 * k + 1;
if (j < n && a[j] > a[j+1]) j++;
if (a[k] < a[j]) break;
exch(a, k, j);
k = j;
}
}
private void exch(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
if (n < k) return -1;
quickSelect(nums,0, n-1, k);
return nums[k-1];
}
private void quickSelect(int[] nums, int lo, int hi, int k) {
if (lo >= hi) return;
int j = partition(nums, lo, hi);
if (j == lo + k - 1) return;
else if (j > lo + k - 1) quickSelect(nums, lo, j-1, k);
else quickSelect(nums, j+1, hi, lo+k-j-1);
}
private int partition(int[] a, int lo, int hi) {
int v = a[lo];
int i = lo, j = hi+1;
while (true) {
while (a[++i] > v) {
if (i == hi) break;
}
while (a[--j] < v) {
if (j == lo) break;
}
if (i >= j) break;
exch(a, i, j);
}
exch(a, lo, j);
return j;
}
private void exch(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
06-20
06-20
06-20
06-20
06-20
06-20
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交