説明タイトル:整数のアレイでは、考え速い行に応じて、Kの多数の配列を見つけます。
アイデア:
- 高速放電を用いて考え、例えば、大規模な要素49の最初の24個の要素を探し、
- まず、高速行、(大に前半、既知の後半には)、中心軸Pを与えると想定されます
- 直接確立された場合、P-低+ 1 == kを解析して(最初の半分は、K-1より大きいので、[P]の要素を有するk番目の最大要素である[P]となるよう)、[P]を出力します。
- P-低+ 1> kの場合、高い前半のk番目の最大要素を更新= P-1、2に進み
- (P-低+もし<K、今回低= P + 1を更新し、及びk = K-(1 + P =低)の後半におけるk番目の最大要素、複雑さはO 2 [時間に進みますN-)]
コードは示しています。
package com.bittech.Test;
/**
* package:com.bittech.Test
* Description:TODO
* @date:2019/5/26
* @Author:weiwei
**/
public class Test0526 {
public int findKth(int[] a, int n, int k) {
return findKth(a, 0, n - 1, k);
}
public int findKth(int[] a, int low, int high, int k) {
int part = partation(a, low, high);
if (k == part - low + 1) {
return a[part];
} else if (k > part - low + 1) {
return findKth(a, part + 1, high, k - part + low - 1);
} else {
return findKth(a, low, part - 1, k);
}
}
public int partation(int[] a, int low, int high) {
int key = a[low];
while (low < high) {
while (low < high && a[high] <= key) {
high--;
a[low] = a[high];
}
while (low < high && a[low] >= key) {
low++;
a[high] = a[low];
}
a[low] = key;
return low;
}
return low;
}
}