【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; }

posted @   github_user  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示