public double findMedianSortedArrays(int[] nums1, int[] nums2) {
final int m = nums1.length;
final int n = nums2.length;
int len = m + n;
double left = -1, right = -1;
int aStart = 0, bStart = 0;
//遍历的范围
for (int i = 0; i <= len / 2; i++) {
left = right;
if (aStart < m && (bStart >= n || nums1[aStart] < nums2[bStart])) {
right = nums1[aStart++];
} else {
right = nums2[bStart++];
}
}
if ((len & 1) == 0) {
return (left + right) / 2;
} else {
return right;
}
}
返回中位数的话,奇数需要最后一次遍历的结果就可以了,偶数需要最后一次和上一次遍历的结果。所以我们用两个变量 left 和 right,right 保存当前循环的结果,在每次循环前将 right 的值赋给 left。这样在最后一次循环的时候,left 将得到 right 的值,也就是上一次循环的结果,接下来 right 更新为最后一次的结果。
循环中该怎么写,什么时候 A 数组后移,什么时候 B 数组后移。用 aStart 和 bStart 分别表示当前指向 A 数组和 B 数组的位置。如果 aStart 还没有到最后并且此时 A 位置的数字小于 B 位置的数组,那么就可以后移了。也就是 aStart < m&&AaStart< BbStart。
但如果 B 数组此刻已经没有数字了,继续取数字 B bStart ,则会越界,所以判断下 bStart 是否大于数组长度了,这样 || 后边的就不会执行了,也就不会导致错误了,所以增加为 aStart < m&&(bStart) >= n||AaStart<BbStart) 。
3.关键点
i <= len / 2 表示寻找中位数需要遍历的次数
aStart 移动的条件是 a 没结束,并且 a 比 b 小
三.自我分析
1.解题思路
apl复制代码
if 有思路
开写
else
去看相关标签,确定具体解题方法
if 有思路
开写
else
看提示信息
if 有思路
开写
else
看答案