LeetCode:寻找两个正序数组的中位数 题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 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
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
其实解法有很多种,我用是最容易看懂的暴力解法,但是在简单易懂的同时就会造成时间的复杂度过高 不过同样也是可以AC的
我先将两个数组合合并,相当于归并排序。然后根据奇数,还是偶数,返回中位数。
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] nums;
int n1 = nums1.length;
int n2 = nums2.length;
nums = new int[m + n];
if (n1 == 0) {
if (n2 % 2 == 0) {
return (nums2[n2 / 2 - 1] + nums2[n2 / 2]) *1.0/ 2.0;
} else {
return nums2[n2 / 2];
}
}
if (n2 == 0) {
if (n1 % 2 == 0) {
return (nums1[n1 / 2 - 1] + nums1[n1 / 2]) *1.0/ 2.0;
} else {
return nums1[n1 / 2];
}
}
int count = 0;
int i = 0, j = 0;
while (count < (n1 + n2)) {
if (i == n1) {
while (j != n2) {
nums[count++] = nums2[j++];
}
break;
}
if (j == n2) {
while (i != n1) {
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])*1.0 / 2.0;
} else {
return nums[count / 2];
}
}
大家有其他好的方法欢迎在评论区留言
|