题目
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
:::info
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
:::
示例 2:
:::info
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
:::
提示:
nums1.length == mnums2.length == n0 <= m <= 10000 <= n <= 10001 <= m + n <= 2000-106 <= nums1[i], nums2[i] <= 106
题解一:
使用四指针动态的从两头去遍历两个数组,保证两遍的步数一直,最后的值则为中位数
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {// System.out.println("nums1:" + nums1[0]);// System.out.println("nums2:" + nums2[0]);int m = nums1.length;int n = nums2.length;boolean isEvenNumber = (m + n) % 2 == 0;int left = (m + n) / 2;int right = left;int index1Prefix = 0;int index1Suffix = m - 1;int index2Prefix = 0;int index2Suffix = n - 1;System.out.println("index1Prefix:" + index1Prefix);System.out.println("index2Prefix:" + index2Prefix);System.out.println("index1Suffix:" + index1Suffix);System.out.println("index2Suffix:" + index2Suffix);System.out.println("left:" + left);System.out.println("right:" + right);//最后一次操作的指针int lastPrefix = 0;int lastSuffix = 0;while (left > 0 || right > 0) {if(left > 0){if(index1Prefix >= m || m == 0){index2Prefix += 1;lastPrefix = 2;}else if(index2Prefix >= n || n == 0){index1Prefix += 1;lastPrefix = 1;}else if (nums1[index1Prefix] < nums2[index2Prefix]) {index1Prefix += 1;lastPrefix = 1;} else {index2Prefix += 1;lastPrefix = 2;}left -= 1;}if(right > 0){if(index1Suffix < 0 || m == 0){index2Suffix -= 1;lastSuffix = 2;}else if(index2Suffix < 0 || n == 0){index1Suffix -= 1;lastSuffix = 1;}else if (nums1[index1Suffix] > nums2[index2Suffix]) {index1Suffix -= 1;lastSuffix = 1;} else {index2Suffix -= 1;lastSuffix = 2;}right -= 1;}System.out.println("--------");System.out.println("index1Prefix:" + index1Prefix);System.out.println("index2Prefix:" + index2Prefix);System.out.println("index1Suffix:" + index1Suffix);System.out.println("index2Suffix:" + index2Suffix);}System.out.println("isEvenNumber:" + isEvenNumber);System.out.println("lastPrefix:" + lastPrefix);System.out.println("lastSuffix:" + lastSuffix);// System.out.println("left:" + left);// System.out.println("right:" + right);if(isEvenNumber){//偶数判断,中位数需要判断,最后两个值。int leftValue = lastPrefix == 1 ? nums1[index1Prefix - 1] : nums2[index2Prefix - 1];int rightValue = lastSuffix == 1 ? nums1[index1Suffix + 1] : nums2[index2Suffix + 1];return Double.valueOf(String.valueOf(leftValue + rightValue)) / 2;}else{//奇数,中位数还在数组中。if(index1Prefix == index1Suffix){return Double.valueOf(String.valueOf(nums1[index1Prefix]));}return Double.valueOf(String.valueOf(nums2[index2Prefix]));}}}
