题目难度---困难
题目要求:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
思路:第一眼看到题目两个数组求中位数,看似很复杂,但是仔细一想,两个数组合在一块不久行了?然后合并后的数组给他排序,进而判断是奇数位数组还是偶数位数组
ok!代码奉上:
public static double findMedianSortedArrays(int[] nums1, int[] nums2) { int[] result = new int[nums1.length + nums2.length];// 首先初始化合并数组的大小 List list = new LinkedList();// 建立新数组,目的是list集合插入方便 if (result.length == 0) {// 判断数组是否为空 return 0; } // 将两个数组中的值放入list集合中 for (int i : nums1) { list.add(i); } for (int j : nums2) { list.add(j); } // 这部很关键--因为后面遍历整个数组排序数组会因为这部操作而大大简化 for (int i = 0; i < list.size(); i++) { result[i] = (Integer) list.get(i);// 很简单的将list集合的元素一个个遍历到result数组中 } // 下面就是新数组及合并后的数组排序 for (int i = 0; i < result.length; i++) { for (int j = i + 1; j < result.length; j++) { if (result[i] >= result[j]) { int temp = result[i]; result[i] = result[j]; result[j] = temp; } } } // -----------------这个地方就是判断数组的元素是奇数偶数,奇数取最中间的数就可以了,偶数就中间俩位取平均了 double answer = 0; if (result.length % 2 == 1) { int q = result.length / 2; answer = result[q]; } else { int p = result.length / 2; for (int i = 0; i < result.length; i++) { if (p - 1 == i) { answer = result[i]; break; } } answer = (answer + result[p]) / 2; } // 上边注意的地方:数组元素计算奇数偶数后取值时应注意遍历是从0开始,因此result.length/2的值要比遍历变量大1 return answer; }
看似很完美是吧!但是!!!时间复杂度的要求O(log (m+n)) 。
因为题目难度属于“困难”,因此不会这么简单,在参考了好多人的答案后,慢慢理解了。
思路:
二分查找思想一样,每次可以去掉k/2的值, k = (m + n) / 2;
该方法的核心是将原问题转换为一个寻找第k小数的问题,这样中位数实际上是第(m + n)/2小的数。因此本质问题是求解第k小数的问题。
这个代码我就不放了,但是我参考的那几个人的链接大家可以参考借鉴下: