04.寻找两个正序数组的中位数
# 04.寻找两个正序数组的中位数
难度:困难
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
示例 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
# 暴力
# 思路
先将两个数组合成一个数组,进行遍历
# 代码
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length;
if (m == 0) {
return getMid(nums2);
}
if (n == 0) {
return getMid(nums1);
}
int[] temp = new int[m + n];
int i = 0, j = 0, count = 0;
while (count != (m + n)) {
if (i == m) {
while (j != n) {
temp[count++] = nums2[j++];
}
break;
}
if (j == n) {
while (i != m) {
temp[count++] = nums1[i++];
}
break;
}
if (nums1[i] < nums2[j]) {
temp[count++] = nums1[i++];
} else {
temp[count++] = nums2[j++];
}
}
return getMid(temp);
}
public double getMid(int[] nums) {
if (nums.length % 2 == 0) {
return (nums[nums.length / 2] + nums[nums.length / 2 - 1]) / 2.0;
} else {
return nums[nums.length / 2];
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 二分法
待补充
上次更新: 2021/01/05, 01:59:46