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]; } }