LeetCode上求两个排序数组中位数问题—— Median of Two Sorted Arrays

本文介绍了一种在O(log(m+n))的时间复杂度内找到两个已排序数组中位数的方法。通过合并两个数组并利用中位数定义,无论数组长度为奇数还是偶数,都能准确找到中位数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5


2.中文翻译

有两个大小分别为m和n的排序数组nums1和nums2。

查找两个排序数组的中位数。 总的运行时间复杂度应该是O(log(m + n))。

例1:
nums1 = [1,3]
nums2 = [2]
中位数是2.0


例2:

nums1 = [1,2]
nums2 = [3,4]

中位数是(2 + 3)/ 2 = 2.5

3.解题思路

合并:在这里,因为规定了时间复杂度,因此我们要充分利用这一点,又因为是排序数组,在C语言数据结构中我们学过两个排序链表的合并,其复杂度为O(log2(m+n));因此,这里采取空间换时间的策略,构建一个新的数组nums[],将nums1和nums2比较,从第一个开始,若nums1元素小于nums2元素,放入新数组nums中,然后nums1往后移动一个位置,大于则放入nums2元素,同样往后移动,当nums1和nums2有一个数组移动完成,则将另一个数组中剩下元素移入nums数组中。

求中位数:中位数在奇数和偶数时取值不同,奇数数组为最中间一个,偶数为中间两个和的一半,根据合并后nums长度来求种中位数

4.算法如下

 public double findMedianSortedArrays(int[] nums1, int[] nums2) {
      double low,high,mid=0;
      int nums[]=new int[nums1.length+nums2.length];
      int i=0,j=0,k=0;
      while (i<nums1.length&&j<nums2.length) {   //两数组都有元素时
if (nums1[i]<nums2[j]) {   
nums[k++]=nums1[i++];    //比较完一次往后移动一位
}
else {
nums[k++]=nums2[j++];
}
}
      while (i<nums1.length)     //nums2数组比较完
     nums[k++]=nums1[i++];
      while(j<nums2.length)    //nums1数组比较完
     nums[k++]=nums2[j++];
      
      if ((nums.length%2)==0) {      //数组长度为偶数情况下
low=(double)nums[nums.length/2];
high=(double)nums[(nums.length/2)-1];
mid=(low+high)/2;
}
      else {
mid=(double)nums[nums.length/2];  //数组长度为奇数情况下
}
      
      return mid;

    }


5.LeetCode上提交结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值