5 条回复
#include <iostream> #include <vector> #include <algorithm> using namespace std; double median(vector<int> nums1, vector<int> nums2) { int m = nums1.size(), n = nums2.size(); int bigger, smaller; vector<int> bigger_nums, smaller_nums; if (m > n) { bigger = m; smaller = n; bigger_nums = nums1; smaller_nums = nums2; } else { bigger = n; smaller = m; bigger_nums = nums2; smaller_nums = nums1; } if (smaller == 0) { if (bigger == 0) return 0.0; else { if (bigger % 2 == 0) { return (bigger_nums[bigger/2] + bigger_nums[bigger/2 - 1]) / 2.0; } else { return double(bigger_nums[bigger/2]); } } } int i_min = 0, i_max = smaller, half = (smaller + bigger + 1) / 2; while (i_min <= i_max) { int i = (i_min + i_max) / 2; int j = half - i; if (i < i_max && bigger_nums[j - 1] > smaller_nums[i]) i_min++; else if (i > i_min && bigger_nums[j] < smaller_nums[i - 1]) i_max--; else { int max_left = 0; if (i == 0) max_left = bigger_nums[j - 1]; else if (j == 0) max_left = smaller_nums[i - 1]; else max_left = max(smaller_nums[i - 1], bigger_nums[j - 1]); int min_right = 0; if (i == smaller) min_right = bigger_nums[j]; else if (j == bigger) min_right = smaller_nums[i]; else min_right = min(smaller_nums[i], bigger_nums[j]); return (max_left + min_right) / 2.0; } } return 0.0; } int main(int argc, char* argv[]) { int m, n; vector<int> nums1, nums2; cin >> m; while (m--) { int num; cin >> num; nums1.push_back(num); } cin >> n; while (n--) { int num; cin >> num; nums2.push_back(num); } cout << median(nums1, nums2) << endl; }
这是第三题!!!
添加回复