欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2024/9/30 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 LeetCode上求两个排序数组中位数问题—— Median of Two Sorted Arrays 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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上提交结果


与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的LeetCode上求两个排序数组中位数问题—— Median of Two Sorted Arrays的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。