这与An algorithm to find the nth largest number in two arrays of size n的问题相同,除了两个排序的数组大小不同。
我试图实现类似于建议的算法版本以坚持我的问题,但我无法证明其正确性。 k = 6似乎失败。当算法结束时,返回的对分别是list1和list2的索引。
#include <iostream>
#include <utility>
using namespace std;
pair<int, int> smallestKElements(int list1[], int list2[], int k) {
// TODO: pass in the array sizes as parameters
int m = 8;
int n = 5;
// initialize array pointers such that i + j = k
int i = m/2;
int j = n/2;
if (i + j + 2 < k) {
while (i + j + 2 != k) {
if (++i + j + 2 == k)
break;
if (i + ++j + 2 == k)
break;
}
} else if (i + j + 2 > k) {
while (i + j + 2 != k) {
if (--i + j + 2 == k)
break;
if (i + --j + 2 == k)
break;
}
}
// step forward in one array and step backward in another array
// decrement step size with every iteration until it is 0
int s = k/2;
while (s > 0) {
if (list1[i] < list2[j]) {
if (m - 1 - i >= s &&
j >= s) {
i += s;
j -= s;
}
} else {
if (i >= s &&
n - 1 - j >= s) {
i -= s;
j += s;
}
}
s = s/2;
}
pair<int, int> r(i,j);
return r;
}
int main() {
int list1[] = {1, 4, 6, 7, 10, 11, 13, 27};
int list2[] = {2, 3, 20, 40, 60};
pair<int, int> test = smallestKElements(list1, list2, 6);
cout << test.first << "," << test.second << endl;
return 0;
}
答案 0 :(得分:0)
好的,如果我理解你的问题,你可以为每个列表做类似的事情:
std::nth_element(lst, lst + k, begin(lst) + list_size, std::greater<int>());
请记住,您需要列表的大小。
您可以对其他阵列执行相同操作。这将修改数组,如果您不想修改数组,请创建std::reference_wrapper
和nth_element数组。