题目
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
1 | 输入:nums1 = [1,3], nums2 = [2] |
示例 2:
1 | 输入:nums1 = [1,2], nums2 = [3,4] |
提示:
1 | nums1.length == m |
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays
我的解答
双指针直接拼接成一个新的数组,然后取中位数。需要额外 n+m 的空间,但只需要各自遍历一遍。
另外有一个问题需要注意,新生成的数组nums 和 nums1``,nums2都需要各自的下标记录。
还有一个技巧需要注意,不论总个数是奇数还是偶数 ,计算中位数的方式(我试出来的)
1 | int right = nums.length/2; |
代码
1 | public double findMedianSortedArrays(int[] nums1, int[] nums2) { |
出问题了,算法的时间复杂度应该为 O(log (m+n)) 。上面算法时间复杂度是 **O(m+n)**,不符合要求。
目前没思路。先跳过了。
参考答案
时间复杂度需要O(log(m+n) 必然是用二分法,题目要求是求中位数,其实就是求第 k小的数的一种特殊情况。
一般都是一个个的遍历去掉不可能是中位数的逻辑,但是因为数组是有序的,完全可以一半一半的排除。
所以,假设我们要找到第k小数,我们可以每次循环排除掉k/2个数。
1 | public double findMedianSortedArrays(int[] nums1, int[] nums2) { |