LeetCode(4 两个正向数组的中位数)

如题在这里插入图片描述
一眼看上去,还被唬住了,直接双指针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];
	}

按理说是应该更快
在这里插入图片描述
可能这就是薛定谔的延迟吧
貌似第一种憨憨方法优化的话居然是殊途同归。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值