题目:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5
思路:
先将两个数组合并成一个有序数组,这个数组的中位数即为答案
C++代码:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size(), n = nums2.size();
int k = 0, i = 0, j = 0; // 当前位置
// 合并
vector<int> com_nums(m+n, 0);
while (i < m && j < n)
com_nums[k++] = (nums1[i] < nums2[j]) ? nums1[i++] : nums2[j++];
// 拼接剩下的nums1或者nums2
while (i < m) com_nums[k++] = nums1[i++];
while (j < n) com_nums[k++] = nums2[j++];
// 判断奇偶,返回中位数.
return k % 2 ? com_nums[k/2] : (com_nums[k/2-1] + com_nums[k/2]) / 2.0;
//return (t.size()%2==0)?( t[t.size()/2-1] + t[t.size()/2] )/2.0:t[t.size()/2];
}
};
python代码实现:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
if len(nums1) == 0 and len(nums2) == 0:
return []
# 合并
combined_nums = nums1 + nums2
combined_nums.sort()
# 中位数位置
com_len = len(combined_nums)
flag = com_len % 2 # 取余,为0则是偶数个,则中位数位置是com_len//2-1,com_len//2,为1,则是奇数个,则中位数位置是com_len//2
if flag == 0:
return (combined_nums[com_len//2-1]+combined_nums[com_len//2])/2
else:
return combined_nums[com_len//2]
注意:python2中,除法无论是/还是//都是取整,而python3中,/是保留小数,//是取整。
python2如果要达到和python3相同的效果,有两种办法:
(1)添加from__future__importdivision
(2)用浮点数进行运算。