您的位置:首页 > 其它

Leetcode(4)之寻找两个有序数组的中位数

2019-12-31 15:12 225 查看

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

题目描述:

解题思路:

可以转换思路,把这题看成是找这两个有序数组中第k小的数(假如两个数组共有11个数,就是找第6小的数;如果共有12个数,就是找第6和第7小数的平均数)。起始时两个数组的下标都为0,当找第k小数时可以先比较两个数组中 k/2下标的数,小的一方说明前面 k/2个数肯定不会是第k小的数了。然后将小的一个数组的下标改为 k/2,k的值也可以减去 k/2,然后从剩下的数里面找第 k-(k/2) 小的数。

代码:

public double FindMedianSortedArrays(int[] nums1, int[] nums2)
{
bool isEven = (nums1.Length + nums2.Length) % 2 == 0;  //两个数组总个数是否是偶数
int k = isEven ? (nums1.Length + nums2.Length) / 2 : (nums1.Length + nums2.Length + 2) / 2;
return FindKthNum(isEven, k, 0, 0, nums1, nums2);
}

private double FindKthNum(bool isEven, int k, int p1, int p2, int[] nums1, int[] nums2)
{
if (p1 == nums1.Length)
{
if (isEven)
return (nums2[p2 + k - 1] + nums2[p2 + k]) / 2.0;
else
return nums2[p2 + k - 1];
}
if (p2 == nums2.Length)
{
if (isEven)
return (nums1[p1 + k - 1] + nums1[p1 + k]) / 2.0;
else
return nums1[p1 + k - 1];
}
if (k == 1)
{
if (isEven)
{
if (p1 + 1 < nums1.Length && nums1[p1 + 1] < nums2[p2])
return (nums1[p1] + nums1[p1 + 1]) / 2.0;
if (p2 + 1 < nums2.Length && nums2[p2 + 1] < nums1[p1])
return (nums2[p2] + nums2[p2 + 1]) / 2.0;
else
return (nums1[p1] + nums2[p2]) / 2.0;
}
else
return Mathf.Min(nums1[p1], nums2[p2]);
}

int q1 = p1 + k / 2 > nums1.Length ? nums1.Length : p1 + k / 2;
int q2 = p2 + k / 2 > nums2.Length ? nums2.Length : p2 + k / 2;

if (nums1[q1 - 1] > nums2[q2 - 1])
{
k = k - (q2 - p2);
p2 = q2;
return FindKthNum(isEven, k, p1, p2, nums1, nums2);
}
else
{
k = k - (q1 - p1);
p1 = q1;
return FindKthNum(isEven, k, p1, p2, nums1, nums2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: