leetcode(4.寻找两个正序数组的中位数)【困难】

该文介绍了一个寻找两个正序数组中位数的算法,要求时间复杂度为O(log(m+n))。当数组为空时,直接返回非空数组的中位数;否则,合并数组并计算中位数。提供的代码实现了这一逻辑,处理了数组可能的重叠情况。
摘要由CSDN通过智能技术生成

一、题目

给定两个大小分别为 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

二、题解

  1. 有一个是空数组,直接输出中位数

    1. nums1空
    2. nums2空
      1. 奇数个直接返回
      2. 偶数个中间两个取平均
  2. 合并数组

    1. 创建新的总数组
    2. nums1先空
    3. nums2先空
    4. nums1、nums2都不空,但是出现重叠,如1、3、5,2、4、6
  3. 再返回中位数

    1. 奇数个直接返回
    2. 偶数个中间两个取平均

三、代码

 public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        int[] nums = new int[m + n];
        //nums1为空
        if (m == 0) {
            if (n % 2 == 0) {
                return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;
            } else {
                return nums2[n / 2];
            }
        }
        //nums2为空
        if (n == 0) {
            if (m % 2 == 0) {
                return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;
            } else {
                return nums1[m / 2];
            }
        }
        //都不空,考虑可能出现重合,如:1,3,5 / 2,3,7
        int count = 0, i = 0, j = 0;
        while(count != (m + n)){  //未全部合并时
            if ( i == m) { //nums1已经全部合并入总数组
                while (j != n) { //只需合并nums2比nums1多的项数
                    nums[count++] = nums2[j++];
                }
                break;
            }
            if (j == n) { //nums2已经全部合并入总数组
                while (i != m) { //只需合并nums1比nums2多的项数
                    nums[count++] = nums1[i++];
                }
                break;
            }
            //nums1 nums2对应的当前值比较大小后,并入总数组
            if (nums1[i] < nums2[j]) {
                nums[count++] = nums1[i++];
            } else {
                nums[count++] = nums2[j++];
            }
        }
        // 合并后总数组输出中位数
        if (count % 2 == 0) {
            return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;
        } else {
            return nums[count / 2];
        }
    }

四、结果

在这里插入图片描述

五、说明

  本文章仅用于记录个人做题记录
  由于本人是个小菜鸡(实锤),题目解法并非最优,且解题过程中参考(抄袭)各大佬解题方法,望见谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值