Median of Two Sorted Arrays in TypeScript

// A function that takes two sorted arrays of numbers and returns the median of the two arrays
function findMedianSortedArrays(nums1: number[], nums2: number[]): number {
  // Get the lengths of the two arrays
  let m = nums1.length;
  let n = nums2.length;

  // If the first array is longer than the second, swap them
  if (m > n) {
    [nums1, nums2] = [nums2, nums1];
    [m, n] = [n, m];
  }

  // Initialize the binary search variables
  let iMin = 0; // The minimum index of the first array
  let iMax = m; // The maximum index of the first array
  let halfLen = Math.floor((m + n + 1) / 2); // The half length of the merged array

  // Perform binary search to find the partition point of the two arrays
  while (iMin <= iMax) {
    // The partition index of the first array
    let i = Math.floor((iMin + iMax) / 2);
    // The partition index of the second array
    let j = halfLen - i;

    // If the left element of the first array is too small, move the partition to the right
    if (i < iMax && nums2[j - 1] > nums1[i]) {
      iMin = i + 1;
    }
    // If the left element of the first array is too large, move the partition to the left
    else if (i > iMin && nums1[i - 1] > nums2[j]) {
      iMax = i - 1;
    }
    // Otherwise, we have found the correct partition
    else {
      // The maximum left element of the merged array
      let maxLeft = 0;
      // If the first array has no left element, use the second array's left element
      if (i == 0) {
        maxLeft = nums2[j - 1];
      }
      // If the second array has no left element, use the first array's left element
      else if (j == 0) {
        maxLeft = nums1[i - 1];
      }
      // Otherwise, use the larger of the two left elements
      else {
        maxLeft = Math.max(nums1[i - 1], nums2[j - 1]);
      }

      // If the total length of the merged array is odd, return the maximum left element as the median
      if ((m + n) % 2 == 1) {
        return maxLeft;
      }

      // The minimum right element of the merged array
      let minRight = 0;
      // If the first array has no right element, use the second array's right element
      if (i == m) {
        minRight = nums2[j];
      }
      // If the second array has no right element, use the first array's right element
      else if (j == n) {
        minRight = nums1[i];
      }
      // Otherwise, use the smaller of the two right elements
      else {
        minRight = Math.min(nums1[i], nums2[j]);
      }

      // If the total length of the merged array is even, return the average of the maximum left and minimum right elements as the median
      return (maxLeft + minRight) / 2;
    }
  }

  // If the binary search fails, return 0 as a default value
  return 0;
}

PrevNext