【Leetcode】0004 寻找两个正序数组的中位数
[https://leetcode-cn.com/problems/median-of-two-sorted-arrays/]
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 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
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
解法一:(C)
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
double res;
int numsize = nums1Size + nums2Size;
int large,small;
//合并两个数组
int num[nums1Size + nums2Size];
for(int i = 0;i < nums1Size;i++)
num[i]=nums1[i];
for(int i = nums1Size;i< numsize;i++)
num[i]=nums2[i-nums1Size];
//排序
for(int i = 0;i<numsize;i++)
for(int j = i+1;j<numsize;j++)
if(num[i]>num[j])
{
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
if(numsize%2 == 1)
res = num[(numsize + 1)/2-1]*1.00000;
else{
//计算两个数的平均值。此处用的是变形法。
if(num[numsize/2]>num[numsize/2-1]){
large=num[numsize/2];
small=num[numsize/2-1];
}
else{
small=num[numsize/2];
large=num[numsize/2-1];
}
res=large-(1.00000*large-small)/2;
}
return res;
}
2022/2/18
1、求平均数:
若直接实现,如:
unsigned average(unsigned a, unsigned b) { return (a + b) / 2; }
则无法处理值溢出的问题。
故考虑以下几种方案:
(1)变形法
比较 a 和 b 的大小
unsigned average(unsigned high, unsigned low) { return low + (high - low) / 2; //return high - (high - low) / 2; }
(2)除法前置
通过与运算,考虑个位丢失
unsigned average(unsigned a, unsigned b) { return (a / 2) + (b / 2) + (a & b & 1); }
(3)空间换时间
直接把类型转换成 Long 再计算结果
unsigned average(unsigned a, unsigned b) { return ((unsigned long long)a + b) / 2; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)