【LeetCode练习】[困难]4. 寻找两个正序数组的中位数
4. 寻找两个正序数组的中位数
题目来源
算法思想:有序数组,中位数
题目:
java代码–合并两个有序数组,不符合复杂度
思路: 合并时间空间均为O(m+n),不符合题目O(log(m+n))
- 合并两个有序数组,使之成为一个有序数组,
- 然后利用排好序的数组,找到中位数
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int[] res &#61; merge(nums1, nums1.length, nums2, nums2.length);double ans &#61; 0.0;if (res.length % 2 &#61;&#61; 0) {ans &#61; (double)(res[res.length / 2] &#43; res[res.length / 2 - 1])/2;}else {ans &#61; res[res.length / 2];}return ans;}public int[] merge(int[] nums1, int m, int[] nums2, int n) {int[] res &#61; new int[m&#43;n];int i &#61; 0;int j &#61; 0;int k &#61; 0;while (i < m && j < n) {if (nums1[i] <&#61; nums2[j]) {res[k] &#61; nums1[i];k&#43;&#43;;i&#43;&#43;;}else {res[k] &#61; nums2[j];k&#43;&#43;;j&#43;&#43;;}}while (i < m) {res[k] &#61; nums1[i];k&#43;&#43;;i&#43;&#43;;}while (j < n) {res[k] &#61; nums2[j];k&#43;&#43;;j&#43;&#43;;}return res;}
}
java代码–O(log(m&#43;n))划分数组
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int lenA &#61; nums1.length;int lenB &#61; nums2.length;if (lenA > lenB) return findMedianSortedArrays(nums2, nums1);int halfLen &#61; (lenA &#43; lenB - 1) / 2;int left &#61; 0;int right &#61; lenA - 1;while (left <&#61; right) { int midA &#61; (right - left) / 2 &#43; left;int midB &#61; halfLen - midA;if (nums1[midA] < nums2[midB]) {left &#61; midA &#43; 1;} else {right &#61; midA - 1;}} int maxLeftA &#61; (left > 0) ? nums1[left - 1] : Integer.MIN_VALUE;int minRightA &#61; (left < lenA) ? nums1[left] : Integer.MAX_VALUE;int maxLeftB &#61; (halfLen - left >&#61; 0) ? nums2[halfLen - left] : Integer.MIN_VALUE;int minRightB &#61; (halfLen - left &#43; 1 < lenB) ? nums2[halfLen - left &#43; 1] : Integer.MAX_VALUE;if ((lenA &#43; lenB) % 2 &#61;&#61; 1) return (double) Math.max(maxLeftA, maxLeftB);return (Math.max(maxLeftA, maxLeftB) &#43; Math.min(minRightA, minRightB)) / 2.0;}
}