diff --git a/MedianOfTwoSortedArrays.cs b/MedianOfTwoSortedArrays.cs new file mode 100644 index 0000000..2100621 --- /dev/null +++ b/MedianOfTwoSortedArrays.cs @@ -0,0 +1,49 @@ +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]; + } +} \ No newline at end of file