题目难度---困难
题目要求:
给定两个大小为 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; }
emmmm第一篇自己写的博客,有问题请留言……^-^
原文地址:https://www.cnblogs.com/wangsr-suc/p/8848363.html
时间: 2024-10-31 11:56:15