(归并第k小)已知两个长度均为n的有序数组a1和a2(均为递增序,但不保证严格单调递增),并且给定正整数k(1≤k≤2n),求数组a1和a2归并排序后的数组里第k小的数值。 试补全程序。
cpp
1#include <bits/stdc++.h>
2using namespace std;
cpp
1int solve(int *a1, int *a2, int n, int k) {,[object Object],
2int left1 = 0, right1 = n - 1;,[object Object],
3int left2 = 0, right2 = n - 1;,[object Object],
4while (left1 <= right1 && left2 <= right2) {,[object Object],
5int m1 = (left1 + right1) >> 1;,[object Object],
6int m2 = (left2 + right2) >> 1;,[object Object],
7int cnt = ①;,[object Object],
8if (②) {,[object Object],
9if (cnt < k) left1 = m1 + 1;,[object Object],
10else right2 = m2 - 1;,[object Object],
11} else {,[object Object],
12if (cnt < k) left2 = m2 + 1;,[object Object],
13else right1 = m1 - 1;,[object Object],
14},[object Object],
15},[object Object],
16if (③) {,[object Object],
17if (left1 == 0) {,[object Object],
18return a2[k - 1];,[object Object],
19} else {,[object Object],
20int x = a1[left1 - 1], ④;,[object Object],
21return std::max(x, y);,[object Object],
22},[object Object],
23} else {,[object Object],
24if (left2 == 0) {,[object Object],
25return a1[k - 1];,[object Object],
26} else {,[object Object],
27int x = a2[left2 - 1], ⑤;,[object Object],
28return std::max(x, y);,[object Object],
29},[object Object],
30},[object Object],
31},[object Object],