寻找两个正序数组的中位数
1、寻找两个正序数组的中位数:
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和nums2。
请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为0(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
代码:
思路:
先把两个数组和并。
在使用工具类Arrays的sort()方法排序。
在判断中间数有几个,分别计算中位数。
java
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double median=0;
int[] arr=new int[nums1.length+nums2.length];
for (int i = 0; i < arr.length; i++) {
if(i<nums1.length){
arr[i]=nums1[i];
}else {
arr[i]=nums2[i- nums1.length];
}
//System.out.print(arr[i]+" ");
}
Arrays.sort(arr);
median=arr[arr.length/2];
if(arr.length%2==0){
//最中间的数有两位
median+=arr[arr.length/2-1];
median/=2;
}
return median;
}
}
思路:
双重for循环遍历两个数组,两个数组进行比大小。
小的放入新数组中。
在判断新数组的中间数有几个,分别计算中位数。
java
class Solution {
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
double median=0;
int[] arr=new int[nums1.length+nums2.length];
int count=0;
int count1=0;
int count2=0;
int i,j=0;
for (i = 0; i < nums1.length; i++) {
for ( j = count2; j < nums2.length; j++) {
if(nums1[i]<nums2[j]){
arr[count++]=nums1[i];
count1++;
break;
}else {
arr[count++]=nums2[j];
count2++;
}
}
}
while(count1<nums1.length){
arr[count++]=nums1[count1++];
}
while(count2<nums2.length){
arr[count++]=nums2[count2++];
}
/*for (int i1 = 0; i1 < arr.length; i1++) {
System.out.print(arr[i1]+" ");
}*/
median=arr[arr.length/2];
if(arr.length%2==0){
//最中间的数有两位
median+=arr[arr.length/2-1];
median/=2;
}
return median;
}
}
大佬代码:
判断了两个数组其中一个为空的情况。
简单粗暴,先将两个数组合并,两个有序数组的合并也是归并排序中的一部分。然后根据奇数,还是偶数,返回中位数。
java
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] nums;
int m = nums1.length;
int n = nums2.length;
nums = new int[m + n];
if (m == 0) {
if (n % 2 == 0) {
return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;
} else {
return nums2[n / 2];
}
}
if (n == 0) {
if (m % 2 == 0) {
return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;
} else {
return nums1[m / 2];
}
}
int count = 0;
int i = 0, j = 0;
while (count != (m + n)) {
if (i == m) {
while (j != n) {
nums[count++] = nums2[j++];
}
break;
}
if (j == n) {
while (i != m) {
nums[count++] = nums1[i++];
}
break;
}
if (nums1[i] < nums2[j]) {
nums[count++] = nums1[i++];
} else {
nums[count++] = nums2[j++];
}
}
if (count % 2 == 0) {
return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;
} else {
return nums[count / 2];
}
}
该代码思路:不合并两个数组,直接算出中位数的的位置,进行求值。
java
public double findMedianSortedArrays(int[] A, int[] B) {
int m = A.length;
int n = B.length;
int len = m + n;
//记录计算中位数需要的值。
int left = -1, right = -1;
//判断两数组已经遍历到的位置。
int aStart = 0, bStart = 0;
//中位数在整个数组(排序好)的中间一位或两位。直接i <= len / 2
for (int i = 0; i <= len / 2; i++) {
left = right;
if (aStart < m && (bStart >= n || A[aStart] < B[bStart])) {
right = A[aStart++];
} else {
right = B[bStart++];
}
}
if ((len & 1) == 0)//长度 & 1,偶数 & 1 结果为0,奇数 & 1 结果为1
return (left + right) / 2.0;
else
return right;
}