LeetCode 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
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
通过次数806,656提交次数1,940,252
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
首先计算两数组总长度的中位置 (Len1+Len2)/2
如果总长度为偶数则取中位置两数求均值,如果是奇数直接返回中位置值
双指针从小到大开始遍历两数组,并且把每次遍历的值存在长度为2的临时数组nums
用一个指针指向临时数组后存入的数据等待替换新数据,每次存入后交替
图解:
过程如下图示: ( nums1=[1,2,3] nums2=[3,4,5] 中位置Center=2,3)
如果两数组都没遍历到边界,则比较大小,小指针向前移动,计数 Count,临时数组存储数据
count | nums[0] | nums[1] | 临时数组下标 |
1 | 1 | 0 | 0 |
count | nums[0] | nums[1] | 临时数组下标 |
2 | 1 | 2 | 1 |
count | nums[0] | nums[1] | 临时数组下标 |
3 | 3 | 2 | 0 |
count | nums[0] | nums[1] | 临时数组下标 |
4 | 3 | 3 | 1 |
遍历结束,总数6个数,取第3和第4个数求平均值返回,即 (nums[0]+nums[1])/2 = 3
代码:
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
| public double findMedianSortedArrays(int[] nums1, int[] nums2) { int len = nums1.length + nums2.length; int center = len / 2; boolean isOdd = (len % 2 == 1); int[] nums = new int[2]; int cur = 0; int p1 = 0; int p2 = 0; int count = 0; while (true) { if (p1 < nums1.length && p2 < nums2.length) { if (nums1[p1] <= nums2[p2]) { nums[cur] = nums1[p1++]; } else { nums[cur] = nums2[p2++]; } } else if (p1 < nums1.length) { nums[cur] = nums1[p1++]; } else { nums[cur] = nums2[p2++]; } if (count++ == center) break; cur = cur == 1 ? 0 : 1; } if (isOdd) { return nums[cur]; } return (nums[0] + nums[1]) / 2f; }
|