题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
来源:力扣(LeetCode) 链接: 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
根据题目描述,求两个数组中位数。 判断总元素个数单双,把两个数组当队列,比较队头元素,小的出栈(注意处理边界问题),循环处理得出中位数
AC 代码
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
if (nums1Size == 0) {
if (nums2Size & 1) {
return nums2[nums2Size >> 1];
} else {
return (nums2[nums2Size >> 1] + nums2[(nums2Size >> 1) - 1]) / 2.0;
}
}
if (nums2Size == 0) {
if (nums1Size & 1) {
return nums1[nums1Size >> 1];
} else {
return (nums1[nums1Size >> 1] + nums1[(nums1Size >> 1) - 1]) / 2.0;
}
}
const int limit = (nums1Size + nums2Size) >> 1;
int i1, i2;
i1 = i2 = 0;
if ((nums1Size + nums2Size) & 1) {
int res;
for (int i = 0; i <= limit; ++i) {
if (i2 >= nums2Size || (i1 < nums1Size && nums1[i1] < nums2[i2])) {
res = nums1[i1++];
continue;
}
res = nums2[i2++];
}
return res;
}
int res1, res2;
res1 = res2 = 0;
for (int i = 0; i <= limit; ++i) {
res1 = res2;
if (i2 >= nums2Size || (i1 < nums1Size && nums1[i1] < nums2[i2])) {
res2 = nums1[i1++];
continue;
}
res2 = nums2[i2++];
}
return (res1 + res2) / 2.0;
}
总结
- 解法1 合并两个数组再排序,获取中位数
- 解法2 判断总元素个数单双,把两个数组当队列,比较队头元素,小的出栈(注意处理边界问题),循环处理得出中位数
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情