Leecode4寻找两个正序数组的中位数

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    	int m = nums1.length;
    	int n = nums2.length;
    	if (m>n) {
			return findMedianSortedArrays(nums2, nums1);
		}
    	int iMin =0, iMax=m;
    	while (iMin<=iMax) {
			int i = (iMin+iMax)/2;
			int j = (m+n+1)/2-i;
			if (i!=0&&j!=n&&nums1[i-1]>nums2[j]) {//必须要把是否超过边界条件放在最前面!
				iMax=i-1;
			}
			else if(j!=0&&i!=m&&nums2[j-1]>nums1[i]){
				iMin=i+1;
			}
			else {
				int maxleft=0;
				if(i==0) maxleft = nums2[j-1];
				else if(j==0) maxleft = nums1[i-1];
				else maxleft = Math.max(nums1[i-1], nums2[j-1]); //nums1[i-1]=nums2[j]
				if((m+n)%2==1) return maxleft; //记得加括号!
				
				int minRight = 0;
				if(i==m) minRight = nums2[j];
				else if(j==n) minRight = nums1[i];
				else minRight = Math.min(nums1[i],nums2[j]);
				
				return (maxleft+minRight)/2.0;
			}
		}
		return 0.0;
    }
}

记录下这道题对于边界判断容易犯错误的三个点:

  1. 为什么一定要m<=n?
    这是由于j=(m+n+1)/2−i 。i = 0 的时候 j 取到最大,(m + n + 1)/2 <= n,推出 m<=n。 i = m 的时候 j 取到最小,(m + n + 1)/2 - m >= 0,同样推出 m<=n。
  2. 三个并列的约束条件,一定要把判断边界放在前面!!顺序很重要,这个问题找了好久才发现。否则数组会溢出。
  3. 边界一定要考虑到各种情况,加上else,另外除法运算一定记得前面的加号加上括号,这是编程中容易忽略的小问题。另外是否要取=也需要斟酌。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值