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;
}
}
记录下这道题对于边界判断容易犯错误的三个点:
- 为什么一定要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。 - 三个并列的约束条件,一定要把判断边界放在前面!!顺序很重要,这个问题找了好久才发现。否则数组会溢出。
- 边界一定要考虑到各种情况,加上else,另外除法运算一定记得前面的加号加上括号,这是编程中容易忽略的小问题。另外是否要取=也需要斟酌。