问题描述:给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
简单分析:
所谓中位数就是一个数据中居于中间位置的数,两个数组(m+n) /2位置的数据是我们要找的数据,所以该问题的关键点有两个:
- 遍历两个数组,查找第(m+n)/2位置的数字
- 考虑数组的长度奇偶性,需要记录索引(m+n)/2位置之前的那个数字
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1== null ? 0 : nums1.length;
int len2 = nums2== null ? 0 : nums2.length;
if (len1==0 && len2 == 0){
throw new RuntimeException("arr has no num");
}else if (len1 == 0){
return findMedianInOneArrays(nums2);
}else if (len2 == 0){
return findMedianInOneArrays(nums1);
}
int minVal = Math.min(nums1[0], nums2[0]);
// 中位数索引,需要查询的次数
int midIndex = (len1 + len2) >> 1;
// 中位数值
int midVal1 = minVal, midVal2 = minVal;
int tail1 = 0, tail2 = 0;
int index = 0;
while (tail1 < len1 && tail2 < len2){
index ++;
midVal1 = midVal2;
if (nums1[tail1] < nums2[tail2]){
midVal2 = nums1[tail1];
if (tail1 < len1)
tail1 ++;
else
break;
}else
{
midVal2 = nums2[tail2];
if (tail2 < len2)
tail2 ++;
else
break;
}
if (index > midIndex){
break;
}
}
for (; index <= midIndex ; index ++){
midVal1 = midVal2;
if (tail1 < len1){
midVal2 = nums1[tail1 ++];
}else{
midVal2 = nums2[tail2 ++];
}
}
boolean needTwo = (len1 + len2) % 2 == 0;
return needTwo ? (midVal1 + midVal2)/2.0f : midVal2;
}
public double findMedianInOneArrays(int[] nums) {
int mid = nums.length >> 1;
if (nums.length % 2 == 0){
return (nums[mid] + nums[mid - 1]) / 2.0f;
}
return nums[mid];
}
}