长度为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),也就是任意两个数都有数值对,而且自己和自己也算数值对
数值对的排序规则,第一维数据从小到大,第一维数据一样的,第二维数据也从小到大
上面的数值对排序结果为:(1, 1)(1, 2)(1, 3)(2, 1)(2, 2)(2, 3)(3, 1)(3, 2)(3, 3)
给定一个数组arr,和整数k,返回第k小的数值对
复杂度为 O(N * logN) 的解法
/* 思路:对数组进行排序,
计算第一维数据的位置,
统计小于和等于第一维数据的值的数量
计算第二维数据的位置
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 时间复杂度为 O(N*logN)
vector<int> getPairKth(vector<int>& arr, int k) {
if (arr.empty() || arr.size() * arr.size() <= k || k < 0) {
return vector<int>();
}
// 排序时间复杂度为 O(N*logN)
sort(arr.begin(), arr.end());
// pair的第一维
int firstDim = k / arr.size();
// 统计小于第一维数据的数量和等于第一维数据的数量
int lessFirst = 0;
int equalFirst = 0;
for (int i = 0; i < arr.size() && arr.at(i) <= arr.at(firstDim); i++) {
arr.at(i) == arr.at(firstDim) ? equalFirst++ : lessFirst++;
}
int secondDim = (k - lessFirst * arr.size()) / equalFirst;
vector<int> res{
arr.at(firstDim), arr.at(secondDim) };
return res;
}
int main()