49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
public class Solution {
|
|
public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
|
|
int middle = (nums1.Length + nums2.Length + 1) / 2 - 1;
|
|
int i = 0, j = 0;
|
|
while (i + j < middle)
|
|
{
|
|
if (i == nums1.Length || j == nums2.Length) {
|
|
return OneArrayLeft(nums1, nums2, i, j, middle);
|
|
}
|
|
CompareNumbers(nums1, nums2, ref i, ref j);
|
|
}
|
|
if (i == nums1.Length || j == nums2.Length) {
|
|
return OneArrayLeft(nums1, nums2, i, j, middle);
|
|
}
|
|
if (2 * middle + 2 == nums1.Length + nums2.Length) {
|
|
double result = CompareNumbers(nums1, nums2, ref i, ref j);
|
|
if (i == nums1.Length) {
|
|
return (result + nums2[j]) / 2.0;
|
|
}
|
|
if (j == nums2.Length) {
|
|
return (result + nums1[i]) / 2.0;
|
|
}
|
|
return (result + CompareNumbers(nums1, nums2, ref i, ref j)) / 2.0;
|
|
}
|
|
return nums1[i] < nums2[j] ? nums1[i] : nums2[j];
|
|
}
|
|
|
|
public int CompareNumbers(int[] nums1, int[] nums2, ref int i, ref int j) {
|
|
if (nums1[i] < nums2[j]) {
|
|
return nums1[++i - 1];
|
|
}
|
|
return nums2[++j - 1];
|
|
}
|
|
|
|
public double OneArrayLeft(int[] nums1, int[] nums2, int i, int j, int middle) {
|
|
if (i == nums1.Length) {
|
|
j += middle - i - j;
|
|
if (2 * middle + 2 == nums1.Length + nums2.Length) {
|
|
return (nums2[j] + nums2[j + 1]) / 2.0;
|
|
}
|
|
return nums2[j];
|
|
}
|
|
i += middle - i - j;
|
|
if (2 * middle + 2 == nums1.Length + nums2.Length) {
|
|
return (nums1[i] + nums1[i + 1]) / 2.0;
|
|
}
|
|
return nums1[i];
|
|
}
|
|
} |