4.1 双指针法
刚做了第三题,用到了滑动窗口,所以这题一下就想到了双指针。
由于数据结构没学好,看到题目要求时间复杂度为O(log(m+n)),装作没看到,硬着头皮写了。
思路如下:
给两个数组首部分别设置一个指针。比较指针所指元素大小,将小的放入结果数组中,并将该指针后移,直到有一个数组遍历完。然后将未遍历完的数组剩余元素直接放入结果数组中,再求得结果数组中位数即可。值得注意的是,结果数组长度要设置为两数组长度和+1,计算中位数时不要忘记这一点,且要转为double型。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int mp=0;
int np=0;
int[] nums3=new int[nums1.length+nums2.length+1];
int i=0;
int a;
double res;
while(mp<nums1.length&&np<nums2.length){
/*if(mp==nums1.length){
nums1[m]
}
nums1[mp]=mp<nums1.length?nums1[mp]:Integer.MAX_VALUE;
nums2[np]=np<nums2.length?nums2[np]:Integer.MAX_VALUE;*/
if(nums1[mp]<=nums2[np]){
nums3[i]=nums1[mp];
mp++;
}else{
nums3[i]=nums2[np];
np++;
}
i++;
}
while(mp<nums1.length){
nums3[i]=nums1[mp];
mp++;
i++;
}
while(np<nums2.length){
nums3[i]=nums2[np];
np++;
i++;
}
a=nums3.length-1;
if(a%2==0){
res=(double)(nums3[a/2]+nums3[(a-1)/2])/2;
}else{
res=(double)nums3[(a-1)/2];
}
return res;
}
}
4.2 二分法
看了题解,知道要用二分法才能达到O(log(m+n))。