04 寻找两个正序数组的中位数

第一遍代码

class Solution {

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {

        int m=nums1.length;

        int n=nums2.length;

        int[] array=new int(10*10*10*10*10*10);

        for(int i=0;i<m;i++)

        {

            array[nums1[i]]++;

        }

        for(int i=0;i<n;i++)

        {

            array[nums2[i]]++;

        }

        if((m+n)%2==0)

        {

        }

        else

        {

  

        }

}

}

本来想用上一题的二哥的数组
但是后面发现数组太大了导致不可行

然后后面想着用hashmap后面发现一样不可行,hashmap解决了数量内存问题,但是不能按照数组顺序
这个题目不是这个思路

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 创建一个新数组,长度为两个数组长度之和
        int[] temp = new int[nums1.length + nums2.length];

        // 复制第一个数组到新数组
        System.arraycopy(nums1, 0, temp, 0, nums1.length);
        
        // 复制第二个数组到新数组
        for (int i = 0; i < nums2.length; i++) {
            temp[i + nums1.length] = nums2[i];
        }

        // 对合并后的数组进行排序
        Arrays.sort(temp);

        // 计算中位数
        int midIndex = temp.length / 2;
        
        // 如果数组长度是奇数
        if ((temp.length & 1) == 1) {
            // 直接返回中间的元素
            return (double) temp[midIndex];
        } else {
            // 如果数组长度是偶数,返回中间两个元素的平均值
            return (temp[midIndex] + temp[midIndex - 1]) / 2.0;
        }
    }
}

这是二哥最简单的代码
这个代码用了sort直接先是把两个数组合并到一个数组里面
System.arraycopy(nums1,0,temp,0,nums1.length)

然后其实这道题目没有想出来
所以基本都是参考二哥的思路
这里他还用了一个归并排序
利用了两个的正序性质,去减少时间复杂度,然后用if条件筛选出来

class Solution {

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {

    int n = nums1.length;

    int m = nums2.length;

    // 判断总元素数量是奇数还是偶数

    boolean flag = ((m + n) % 2) == 0;

    int point1 = 0, point2 = 0; // 分别为 nums1 和 nums2 的指针

    int remNum1 = 0, remNum2 = 0; // 用于存储当前遍历的元素和前一个元素

  

    // 遍历两个数组的元素,直到到达中位数的位置

    for (int i = 0; i <= (n + m) / 2; i++) {

        remNum2 = remNum1; // 存储前一个元素

        // 比较两个数组当前元素,取较小的那个

        if (point1 < n && (point2 >= m || nums1[point1] <= nums2[point2])) {

            remNum1 = nums1[point1++];

        } else {

            remNum1 = nums2[point2++];

        }

    }

  

    // 如果总元素数量是偶数,则中位数是中间两个数的平均值

    if (flag) {

        return (remNum1 + remNum2) / 2.0;

    }

    // 如果总元素数量是奇数,则中位数是中间的那个数

    return remNum1 * 1.0;

}

}
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锦否

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值