题目:给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
思路:由于两数组是有序排列的,所以可以通过计算两个数组中位数的索引(mid)并通过双指针从左到右遍历找到第mid个大的数。再通过奇偶情况来进行特殊的处理。
总结:想法很简单,情况很麻烦。在调试过程中发现很多例子会出现下标越界的情况,由于能力有限只能通过面向例子编程一个一个例子处理异常情况,一步一步的往代码上“拉屎”。但是没想到屎山的执行效率还可以。
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int l1 = nums1.length, l2 = nums2.length;
int mid = (l1 + l2)/ 2;
int n1 = 0,n2 = 0; //两数组的指针
int count = 0; //记录寻找次数
while(count < mid ){
if (l1 ==0){ //空数组情况
n2++;
count++;
continue;
}
if (l2 == 0){
n1++;
count++;
continue;
}
if (n1 >= nums1.length){ //一个数组以遍历完的情况
n2++;
} else if (n2 >= nums2.length) {
n1++;
} else {
if (nums1[n1] > nums2[n2] && n2 < nums2.length){
n2++;
}else {
n1++;
}
}
count++;
}
double res = 0;
if ((l1 + l2) % 2 == 1){ //奇数
if (n1 >= nums1.length) //当有一个数组遍历完,中位数即为另一个指针
res = nums2[n2];
else if (n2 >= nums2.length)
res = nums1[n1];
else res = Math.min(nums1[n1],nums2[n2]); //都没遍历完就是最小的那个
}else { //偶数
double temp = 0;
double last = 0;
if (n1 >= nums1.length && n2 >= 1){ //第一个数组遍历完,且第二个数组遍历了一个
if (l1==0){ //第一个数组为空的情况
temp = nums2[n2-1];
last = nums2[n2];
}else{
temp = nums1[n1-1] > nums2[n2-1]?nums1[n1-1]:nums2[n2-1];
last = nums2[n2];
}
} else if (n1 >= nums1.length && n2 == 0) {//第一个数组遍历完,且第二个数组遍历了0个
temp = nums1[n1-1];
last = nums2[n2];
} else if (n2 >= nums2.length && n1>= 1) { //同前面情况
if (l2==0){
temp = nums1[n1-1];
last = nums1[n1];
}else {
temp = nums2[n2-1] > nums1[n1-1]?nums2[n2-1]:nums1[n1-1];
last = nums1[n1];
}
} else if (n2 >= nums2.length && n1 == 0) { //同前面
temp = nums2[n2 - 1];
last = nums1[n1];
}
else { //两个都没遍历完的情况
if (nums1[n1] > nums2[n2]){ //上大下小
last = nums2[n2];
if (n1 == 0){ //第一个指针在0的情况
temp = nums2[n2-1];
}else if (n2 == 0){
temp = nums1[n1-1];
}else {
temp = Math.max(nums1[n1-1],nums2[n2-1]);
}
}else {
last = nums1[n1];
if (n1 == 0){
temp = nums2[n2-1];
}else if (n2 == 0){
temp = nums1[n1-1];
}else {
temp = Math.max(nums1[n1-1],nums2[n2-1]);
}
}
}
res = (temp+last)/2;
}
return res;
}