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