题目
给定两个大小分别为 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 == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= 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]));
}
}
}