

二. 思路

三. 代码
class Solution
{
/*
a1是长度较短的数组,a2是长度较长的数组
l是a1中没被排除的起始位置,可能为n或m
r是a2中没被排除的起始位置
k是在a1和a2中找第k小的数(从s1、s2开始算)
*/
int tfind(int[] a1, int l, int[] a2, int r, int k)
{
if (a1.length - l > a2.length - r)//让剩余元素数量较少的在前面
return tfind(a2, r, a1, l, k);
if (a1.length == l) return a2[r + k - 1];//若a1为空
if (k == 1) return Math.min(a1[l], a2[r]);//返回二者最小的一个数
//sl和sr表示新的起始位置,要比的数是上一个,比输的排除
int sl = Math.min(a1.length, l + k / 2), sr = Math.min(a2.length, r + k - k / 2);//sr是剩余的数就行,不一定非得一半
if (a1[sl - 1] <= a2[sr - 1]) return tfind(a1, sl, a2, r, k - (sl - l));
return tfind(a1, l, a2, sr, k - (sr - r));
}
public double findMedianSortedArrays(int[] nums1, int[] nums2)
{
int n = nums1.length, m = nums2.length, sum = n + m;
if (sum % 2 != 0) return tfind(nums1, 0, nums2, 0, sum / 2 + 1);//奇数情况,初始有效起点都为0
else
{
//偶数情况,初始有效起点都为0
int k1 = tfind(nums1, 0, nums2, 0, sum / 2);
int k2 = tfind(nums2, 0, nums1, 0, sum / 2 + 1);
return (k1 + k2) / 2.0;
}
}
}