长度为N的数组arr,一定可以组成N^2个数值对,
例如arr=[3,1,2];
数值对有(3,3),(3,1),(3,2),(1,3),(1,1),(1,2),(2,3),(2,1),(2,2);
也就是任意两个数都有数值对,而且自己和自己也算数值对,数值对怎么排序,规定,第一维数据从小到大,
第二维数据一样的,第二维数组也从小到大。给定一个数组arr,和整数K,返回第k小的数值对。
假设n个数有序,想找第k小的数值对,
- 第一个数的下标为(k-1)/n ,对应值为f
- 遍历数组小于f有a个,等于f 有b个
- (k - a * n) = s, 代表在第一个数为f的情况下,找第s小。
- 第二个数下标为(s-1)/b;
public static int[] kthMinPair(int[] arr, int k) {
int N = arr.length;
if (k > N * N) {
return null;
}
Arrays.sort(arr);
int fristNum = arr[(k - 1) / N];
int lessFristNumSize = 0;
int fristNumSize = 0;
for (int i = 0; i < N && arr[i] <= fristNum; i++) {
if (arr[i] < fristNum) {
lessFristNumSize++;
} else {
fristNumSize++;
}
}
int rest = k - (lessFristNumSize * N);
return new int[] { fristNum, arr[(rest - 1) / fristNumSize] };
}
网友评论