如题
一眼看上去,还被唬住了,直接双指针plus安排
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
if(nums1.length==0) {
return nums2.length%2==0?((double)(nums2[nums2.length/2-1]+nums2[nums2.length/2]))/2:nums2[nums2.length/2];
}
if(nums2.length==0)
{
return nums1.length%2==0?((double)(nums1[nums1.length/2-1]+nums1[nums1.length/2]))/2:nums1[nums1.length/2];
}
int[] in;
int[] ax;
if ((nums1.length + nums2.length) % 2 == 0) {
in = new int[(nums1.length + nums2.length) / 2];// 小到大缓存
ax = new int[(nums1.length + nums2.length) / 2];// 大到小缓存
} else {
in = new int[(nums1.length + nums2.length) / 2 + 1];// 小到大缓存
ax = new int[(nums1.length + nums2.length) / 2 + 1];// 大到小缓存
}
int i1 = 0;// nums1的最小值指针
int i2 = 0;// nums2的最小值指针
int a1 = nums1.length - 1;// nums1的最大值指针
int a2 = nums2.length - 1;// nums2的最大值指针
while (in.length > i1 + i2) {// 填满in
if (i2==nums2.length||(i1!=nums1.length&&nums1[i1] <= nums2[i2])) {//注意数组越界
in[i1 + i2] = nums1[i1];
i1++;
} else {
in[i1 + i2] = nums2[i2];
i2++;
}
}
while (ax.length > (nums1.length - a1 + nums2.length - a2 - 2)) {// 填满ax
if (a1==-1||(a2!=-1&&nums2[a2] >= nums1[a1])) {
ax[nums1.length - a1 + nums2.length - a2 - 2] = nums2[a2];
a2--;
} else {
ax[nums1.length - a1 + nums2.length - a2 - 2] = nums1[a1];
a1--;
}
}
double sum = in[in.length - 1] + ax[ax.length - 1];
return sum / 2;// 返回in与ax的最后一位平均数
}
一次遍历即可。看上去还行
但是仔细一想,为啥要搞这么复杂?直接一个数组放不好么
public static double findMedianSortedArrays1(int[] nums1, int[] nums2) {
if(nums1.length==0) {
return nums2.length%2==0?((double)(nums2[nums2.length/2-1]+nums2[nums2.length/2]))/2:nums2[nums2.length/2];
}
if(nums2.length==0)
{
return nums1.length%2==0?((double)(nums1[nums1.length/2-1]+nums1[nums1.length/2]))/2:nums1[nums1.length/2];
}
int index1=0;
int index2=0;
int []all = new int[nums1.length+nums2.length];
for(int i=0;i<all.length;i++) {
if(index2==nums2.length||(index1!=nums1.length&&nums1[index1]<=nums2[index2])) {
all[i]=nums1[index1];//注意判断越界
index1++;
}else {
all[i]=nums2[index2];
index2++;
}
}
return all.length%2==0?((double)(all[all.length/2-1]+all[all.length/2]))/2:all[all.length/2];
}
还是一次遍历,但是明显好想多了吧
然后在仔细一看,这返回值只会到all.length/2位置,那何必全放进去呢
public static double findMedianSortedArrays1(int[] nums1, int[] nums2) {
if(nums1.length==0) {
return nums2.length%2==0?((double)(nums2[nums2.length/2-1]+nums2[nums2.length/2]))/2:nums2[nums2.length/2];
}
if(nums2.length==0)
{
return nums1.length%2==0?((double)(nums1[nums1.length/2-1]+nums1[nums1.length/2]))/2:nums1[nums1.length/2];
}
int index1=0;
int index2=0;
int []all = new int[(nums1.length+nums2.length)/2+1];
for(int i=0;i<all.length;i++) {
if(index2==nums2.length||(index1!=nums1.length&&nums1[index1]<=nums2[index2])) {
all[i]=nums1[index1];//注意判断越界
index1++;
}else {
all[i]=nums2[index2];
index2++;
}
}
return (nums1.length+nums2.length)%2==0?((double)(all[all.length-2]+all[all.length-1]))/2:all[all.length-1];
}
按理说是应该更快
可能这就是薛定谔的延迟吧
貌似第一种憨憨方法优化的话居然是殊途同归。