1、题目描述
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
2、题目分析
题目中要求的是两个正序数组的中位数。如下几种情况:
一、
①其中一个数组长度为0,那么只需要判断另一个数组的长度的奇偶数,然后进去取值。
二、
①两个数组长度都不为0,如果其中一个数组提前比较完,剩下另一个数组的情况。
②如果两个数组比较的时候都没到数组的结尾下标,就正常比较。最后的结果数组,判断数组长度,判断奇偶数,然后取值。
3、代码实现
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int nums1Length = nums1.length;
int nums2Length = nums2.length;
int resultLength = nums1Length + nums2Length;
// 定义结果集数组
int[] result = new int[resultLength];
// 情况一: 判断其中一个数组长度为0
if(nums1Length == 0){
// num2长度为偶数,直接返回的是中间两个数的平均数
if(nums2Length % 2 == 0){
return (nums2[nums2Length/2 -1] + nums2[nums2Length/2]) / 2.0;
}else{
return nums2[nums2Length/2];
}
}
if(nums2Length == 0){
if(nums1Length % 2 == 0){
return (nums1[nums1Length / 2 - 1] + nums1[nums1Length / 2]) / 2.0;
}else{
return (nums1[nums1Length / 2]);
}
}
// 情况二:两个数组都不为空,且两个数组的长度不等,不等的话就比较
// 定义新数组下表
int count = 0;
int i = 0,j = 0;
// 判断最后结果数组下表肯定是和两个数组长度和相等的
while(count != resultLength){
// 当其中一个数组走完的时候
if(i == nums1Length){
while(j != nums2Length){
result[count++] = nums2[j++];
}
break;
}
if(j == nums2Length){
while(i != nums1Length){
result[count++] = nums1[i++];
}
break;
}
// 要不然进行比较
if(nums1[i] < nums2[j]){
result[count++] = nums1[i++];
}else{
result[count++] = nums2[j++];
}
}
if(count % 2 == 0){
return (result[count / 2 - 1] + result[count / 2]) / 2.0;
}else{
return result[count / 2];
}
}
}