1 题目
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:设计一个时间复杂度为 O(log (m+n)) 的算法.
2 解法
这个题如果m+n是偶数, 就是找到第(m+n)/2以及第(m+n)/2 + 1个数, 如果是奇数, 那么就是第(m+n +1)/2个数.
2.1 普通解法
2.1.1 思路
因为两个序列都是排好序的, 那就按照双指针法找当前两个序列中更小的数
2.1.2 代码
太笨了...毕竟这不是时间复杂度为log(m+n)的方法, 也就不优化了:
class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {double result = 0.0;int nums1_size = nums1.size();int nums2_size = nums2.size();int nums1_offset = 0;int nums2_offset = 0;bool total_num_odd = ((nums1_size + nums2_size) % 2 == 0 ? false : true);int target_index = (nums1_size + nums2_size - 1) / 2;while (nums1_offset < nums1_size && nums2_offset < nums2_size && target_index) {if (nums1[nums1_offset] <= nums2[nums2_offset]) {nums1_offset ++;} else {nums2_offset ++;}target_index --;}if (nums1_offset == nums1_size) {if (total_num_odd) {result = (double)nums2[target_index + nums2_offset];} else {result = (double)((nums2[target_index + nums2_offset] + nums2[target_index + nums2_offset + 1]) / 2.0);}} else if (nums2_offset == nums2_size) {if (total_num_odd) {result = (double)nums1[target_index + nums1_offset];} else {result = (double)((nums1[target_index + nums1_offset] + nums1[target_index + nums1_offset + 1]) / 2.0);}} else {if (total_num_odd) {result = (double)(nums1[nums1_offset] < nums2[nums2_offset] ? nums1[nums1_offset] : nums2[nums2_offset]);} else {if (nums1[nums1_offset] < nums2[nums2_offset]) {if (nums1_offset + 1 < nums1_size && nums1[nums1_offset + 1] < nums2[nums2_offset]) {result = (double)((nums1[nums1_offset] + nums1[nums1_offset + 1]) / 2.0);} else {result = (double)((nums1[nums1_offset] + nums2[nums2_offset]) / 2.0);}} else {if (nums2_offset + 1 < nums2_size && nums2[nums2_offset + 1] < nums1[nums1_offset]) {result = (double)((nums2[nums2_offset] + nums2[nums2_offset + 1]) / 2.0);} else {result = (double)((nums1[nums1_offset] + nums2[nums2_offset]) / 2.0);}}}}return result;}
};
这种解法的时间复杂度是o(m + n).
2.2 时间复杂度o(log(m+n))解法
2.2.1 思路
既然涉及到时间复杂度是o(log(m+n)), 就要用到二分法了. 感觉这样做坑挺多. 后来看了标准答案, 跳出对比两个序列中位数的固有思维, 转而寻找整个序列的第K的数, 如果m + n是奇数, 那么就是要寻找 (m + n) / 2, 如果m + n是偶数, 那么就要找(m + n) / 2 - 1和(m + n) / 2.