寻找两个有序数组的中位数
题目:
给定两个大小为 m 和 n 的有序数组 nums1
和 nums2
。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1
和 nums2
不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
看到这个题。很容易想到我写过的一篇博客合并两个有序的数组它其中第三种解法我们可以应用。
所以这个题的思路就是:
1.申请一个这两个数组长度加起来大小的新数组。
2.按照顺序排列
3.元素个数分为奇数和偶数:
3.1若为奇数,直接返回长度除以2然后加1下标的元素。
3.2若为偶数,返回长度除以2以及长度除以2加1的和的一半。
代码如下:
class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int n1 = nums1.length; int n2 = nums2.length; int[] nums = new int[n1 + n2]; int i = 0; int j = 0; int index = 0; while(i < n1 && j < n2){ if(nums[i] <= nums[j]){ nums[index++] = nums1[i++]; }else{ nums[index++] = nums2[j++]; } } if(i < n1){ while(i < n1){ nums[index++] = nums1[i++]; } } if(j < n2){ while(j < n2){ nums[index++] = nums2[j++]; } } if(nums.length % 2 == 1){ return nums[(nums.length / 2) + 1]; }else{ int num = nums[nums.length / 2] + nums[nums.length / 2 +1]; return nums[num]; } } }
上面这种方法都是在插入的时候就排序,如果先放进去再排序则时间复杂度就超了。