1. 题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1,nums2。请你找出并返回这两个正序数组的中位数。
2. 示例
3. 提示
- nums1.length == m
- nums2.length == n
- 0 <= m,n <= 1000
- 1 <= m+n <= 2000
- -10^6 <= nums1[i],nums2[i] <= 10^6
4. solution
- 一开始看到题目等级为
困难
,我吓一跳,寻思那就用递归的思路进行解题,结果需要处理的情况较多较为复杂,且花费了较长时间,最终还是妥协了,还是用另一种简单方法吧。 - 除了处理特殊情况外,直接用合并排序将两个数组合成一个数组,再寻找中位数即可。代码如下:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
// 1.若某一数组为空
if(nums1.length == 0){
int mid = nums2.length / 2;
if(nums2.length%2 == 0){
return (nums2[mid-1] + nums2[mid]) / 2.0;
}else{
return nums2[mid];
}
}
if(nums2.length == 0){
int mid = nums1.length / 2;
if(nums1.length%2 == 0){
return (nums1[mid-1] + nums1[mid]) / 2.0;
}else{
return nums1[mid];
}
}
// 2. 两数组中位数相同,直接返回
int mid1 = (nums1.length-1) / 2, mid2 = (nums2.length-1) / 2;
double median1,median2;
if(nums1.length % 2 == 1){
median1 = nums1[mid1];
}else{
median1 = (nums1[mid1] + nums1[mid1+1]) / 2.0;
}
if(nums2.length % 2 == 1){
median2 = nums2[mid2];
}else{
median2 = (nums2[mid2] + nums2[mid2+1]) / 2.0;
}
if(median1 == median2){
return median1;
}
// 2. 两数组均不为空 且 中位数不同
int[] arr = 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]){
arr[k++] = nums1[i++];
}else{
arr[k++] = nums2[j++];
}
}
while(i < nums1.length){
arr[k++] = nums1[i++];
}
while(j < nums2.length){
arr[k++] = nums2[j++];
}
int mid = (arr.length-1) / 2;
if(arr.length % 2 == 0){
return (arr[mid] + arr[mid+1]) / 2.0;
}
return arr[mid];
}
}
5. 题目来源
力扣