题目(英文版)
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)).
题目(中文翻译版)
这里有两个数组nums1 和 nums2 ,它们的长度分别是m和n。找到这两个排序数组的中值。要求运行的时间复杂度为O(log(m+n)).
解析
这里的要求的时间复杂度为m+n,则说明,需要用遍历的方式。
我们采用一个数组nums3,做nums1和nums2的合并,而且这个数组也是顺序存储的。然后找出其中的中间值就成。
主要是考虑合并后数组3的长度,如果是偶数的话,则有两个中值,这时候我们需要取两个中值相加除以2。如果长度是基数的话,则返回一个中值就成,这时候就通过num3中找到返回即可。
这里主要是合并算法可能大家有疑惑,这方面,就把数组考虑成一个链表就成,只不过这个链表是顺序存储的。
合并算法思路如下:
初始状态时,用p,q指向nums1和nums2的数组的第一个元素,然后进行比较。
算法
public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int num1_length=nums1.length;
int num2_length=nums2.length;
int []nums3 = new int [num1_length+num2_length];
int p=0,q=0,medu=0;
while(p < num1_length && q < num2_length){
if(nums1[p] <= nums2[q]){
nums3[medu]=nums1[p];
medu++;
p++;
}else{
nums3[medu]=nums2[q];
q++;
medu++;
}
}
//如果p遍历完毕
while(q < num2_length){
nums3[medu]=nums2[q];
q++;medu++;
}
//如果q遍历完毕
while(p < num1_length){
nums3[medu]=nums1[p];
p++;medu++;
}
if(nums3.length %2 == 0 && nums3.length !=0){
int med1 = (nums3.length-1)/2;
return (nums3[med1]+nums3[med1+1])/2.0;
}else{
return nums3[nums3.length/2];
}
}
}
测试代码
package leetcode4;
public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int num1_length=nums1.length;
int num2_length=nums2.length;
int []nums3 = new int [num1_length+num2_length];
int p=0,q=0,medu=0;
while(p < num1_length && q < num2_length){
if(nums1[p] <= nums2[q]){
nums3[medu]=nums1[p];
medu++;
p++;
}else{
nums3[medu]=nums2[q];
q++;
medu++;
}
}
//如果p遍历完毕
while(q < num2_length){
nums3[medu]=nums2[q];
q++;medu++;
}
//如果q遍历完毕
while(p < num1_length){
nums3[medu]=nums1[p];
p++;medu++;
}
if(nums3.length %2 == 0 && nums3.length !=0){
int med1 = (nums3.length-1)/2;
return (nums3[med1]+nums3[med1+1])/2.0;
}else{
return nums3[nums3.length/2];
}
}
public static void main(String[] args) {
Solution s = new Solution();
int []nums1={};
int []nums2 = {2,3};
System.out.println(s.findMedianSortedArrays(nums1, nums2));
int []nums3={1};
int []nums4 = {2,3};
System.out.println(s.findMedianSortedArrays(nums3, nums4));
}
}