给定两个大小分别为 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的时候,或者一个数组的数全都比另一个数组的数小或大的时候。
我一开始没有考虑到一个数组的数全都比另一个数组的数小或大的情况,所以编译出错造成数组越界异常了。
代码:(自己写的)
package text11;
public class Solution {
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
double result=0;
int l1=nums1.length;
int l2=nums2.length;
int i=0,j=0;
if(l1+l2==1) {
if(l1==1) {
result=nums1[0];
}else {
result=nums2[0];
}
}
else
{
int aa=(l1+l2)/2+1;
int[] arr=new int[aa];
int pos=0;
for(pos=0;pos<=aa-1;pos++) {
if(i==l1) {
arr[pos]=nums2[j];
j++;
}
else if(j==l2) {
arr[pos]=nums1[i];
i++;
}
else {
if(nums1[i]<nums2[j]) {
arr[pos]=nums1[i];
i++;
}
else {
arr[pos]=nums2[j];
j++;
}
}
}
// System.out.print(arr[1]);
//System.out.print(arr[2]);
if((l1+l2)%2==1)//如果是奇数
{
result=arr[aa-1];
}else
{
result=(arr[aa-2]+arr[aa-1])/2.0;
}
}
return result;
}
public static void main(String args[]) {
int[] num1 = new int[] {1,2};
int[] num2 = new int[] {3,4};
double result= findMedianSortedArrays(num1,num2);
System.out.print(result);
}
}