PAT 甲级 1029 Median #include <bits/stdc++.h> using namespace std; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif // Input int n; cin >> n; vector<long long> nums1(n); for (auto& i : nums1) cin >> i; cin >> n; vector<long long> nums2(n); for (auto& i : nums2) cin >> i; // 中位数坐标 int target = (nums1.size() + nums2.size() - 1) / 2; // 合并输出,好写但O((m+n)log(m+n)) // vector<long long> nums; // nums.insert(nums.end(), nums1.begin(), nums1.end()); // nums.insert(nums.end(), nums2.begin(), nums2.end()); // sort(nums.begin(), nums.end()); // cout << nums[target]; // two pointer,归并的方式计数或者直接归并,O(m+n) int i = 0, j = 0, index = 0; long long ans; // 归并过程 while (i < nums1.size() && j < nums2.size()) { if (nums1[i] < nums2[j]) { if (index == target) { ans = nums1[i]; } ++i, ++index; } else { if (index == target) { ans = nums2[j]; } ++j, ++index; } } // 剩余元素 while (i < nums1.size()) { if (index == target) { ans = nums1[i]; } ++i, ++index; } while (j < nums2.size()) { if (index == target) { ans = nums2[j]; } ++j, ++index; } cout << ans; }