一、题目
1、审题:
2、分析
求两个给出的有序数组整合后的最中间的数字;
二、解答
1、方法一、
暴力法:
新建一个数组存放两个所给数组的元素;然后根据数组长度来取出中间的数;注意分数组中元素个数为奇数和偶数情况;
时间复杂度为 O(log(m+n))
class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int[] arr = new int[nums1.length + nums2.length]; // 新建数组 if(nums1.length == 0 && nums2.length == 0) return 0; else if(nums1.length == 0) arr = nums2; else if(nums2.length == 0) arr = nums1; else { int i = 0, j = 0, index = 0; while (i < nums1.length && j < nums2.length) { if (nums1[i] < nums2[j]) arr[index++] = nums1[i++]; else arr[index++] = nums2[j++]; } while (i < nums1.length) arr[index++] = nums1[i++]; while (j < nums2.length) arr[index++] = nums2[j++]; } int median = arr.length / 2; double result; if(arr.length % 2 == 1) // 一个中间数 result = arr[median]; else { // 俩个中间数 result = (arr[median] + arr[median - 1]) / 2.0; } return result; } }
方法二、
① 不需要将两个数组真的合并,我们只需要找到中位数在哪里就可以了。
② 用 len 表示合并后数组的长度,如果是奇数,我们需要知道第 (len + 1)/ 2 个数就可以了,如果遍历的话需要遍历 int ( len / 2 ) + 1 次。
③ 如果是偶数,我们需要知道第 len / 2 和 len / 2 + 1 个数,也是需要遍历 len / 2 + 1 次。所以遍历的话,奇数和偶数都是 len / 2 + 1 次。
④ 返回中位数的话,奇数需要最后一次遍历的结果就可以了,偶数需要最后一次和上一次遍历的结果。所以我们用两个变量 left 和 right ,right 保存当前循环的结果,在每次循环前将 right 的值赋给 left 。
public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.length; int n = nums2.length; int len = m + n; int left = -1 , right = -1; int aStart = 0, bStart = 0; for (int i = 0; i <= len / 2; i++) { left = right; if(aStart < m && (bStart >= n || nums1[aStart] < nums2[bStart])) right = nums1[aStart++]; else right = nums2[bStart++]; } if((len & 1) == 0) // 偶数 return (left + right ) / 2.0; return right; }