寻找两个正序数组的中位数
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays
1. 题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
2. 示例
示例 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
3. 思路
- 中位数:n个有序数的中位数,如果n是偶数,那么中位数就等于最中间的两个数之和除以2;如果n为奇数平均数就是最中间那个数。
- 两个数组都是有序的并且都是从小到大的;
- 通过求两个数组的长度相加进而求出总个数,根据总个数判断奇数个还是偶数个;
- 根据中位数在总数n的第几位(决定了取元素的时候需要从小到大数到第几位),比较取出元素(比如在总长为7,7为奇数则中位数应该在第(7+1)/ 2 = 4,如果总长度为8,则是偶数中位数为最中间两位之和/2,即是第(8+1)/ 2 = 4,和第5位之和除以2 )
- 题目中是两个数组并非一个数组,那么我们可以看做时一个数组,我们从小到大挨个取出元素直到取出最中间那一个数(或者最中间的两个数)
- (比如{1,3,4},{1,2,6},总共6个数,那么中位数=(第三位+第四位) / 2,按照从小到大比较两个数组中较小的数取出,
第一次取出的是第一个数组中的1,
第二次取出的是第二数组中的1,
第三次取出的是第二个数组中的2,
第四次取出的是第一个数组中的3,
)
4. 代码
/**
* 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
*
* 算法的时间复杂度应该为 O(log (m+n)) 。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode.cn/problems/median-of-two-sorted-arrays
*/
public class FindMedianSortedArrays {
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len = nums1.length + nums2.length;
int mid = (len+1) / 2;
double midNumber = 0;
//判断数组元素总数是偶数个 中位数=(num[mid-1] + num[mid]) / 2
if (len % 2 == 0 ){
int i = 0, j=0, z;
double number1 = 0, number2=0;
for (z = 0; z < mid; z++){
if (i >= nums1.length){ //判断下标越界
number1 = nums2[j];
j++;
}else if (j >= nums2.length){ //判断下标越界
number1 = nums1[i];
i++;
}else if (nums1[i] < nums2[j]){
number1 = nums1[i];
i++;
}else {
number1 = nums2[j];
j++;
}
}
if (i >= nums1.length){ //判断下标越界
number2 = nums2[j];
j++;
}else if (j >= nums2.length){ //判断下标越界
number2 = nums1[i];
i++;
}else if (nums1[i] < nums2[j]){
number2 = nums1[i];
i++;
}else {
number2 = nums2[j];
j++;
}
return (number1 + number2) / 2;
}else {
//奇数个mid = num[mid-1];
int i = 0, j=0, z;
for (z = 0; z < mid; z++){
if (i >= nums1.length){ //判断下标越界
midNumber = nums2[j];
j++;
} else if(j >= nums2.length){ //判断下标越界
midNumber = nums1[i];
i++;
}else if (nums1[i]<nums2[j]){
midNumber = nums1[i];
i++;
}else {
midNumber = nums2[j];
j++;
}
}
return midNumber;
}
}
public static void main(String[] args) {
int[] ints = {1, 2, 3};
int[] ints1 = {1, 2, 2} ;
double medianSortedArrays = findMedianSortedArrays(ints, ints1);
System.out.println("中位数为:" + medianSortedArrays);
}
}
5. 提交截图
执行用时:1 ms, 在所有 Java 提交中击败了
100.00%
的用户
内存消耗:42.2 MB, 在所有 Java 提交中击败了78.67%
的用户
通过测试用例:2094 / 2094