Median of Two Sorted Arrays (LeetCode)

Code Snippets 4 U

Problem

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.

The overall run time complexity should be O(log (m+n)).

Example 1:

Input: nums1 = [1,3], nums2 = [2]

Output: 2.00000

Explanation: merged array = [1,2,3] and median is 2.

Example 2:

Input: nums1 = [1,2], nums2 = [3,4]

Output: 2.50000

Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.

Constraints:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

Solution 1

 public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
        // find the median merging point
        var merged = new List<int>();
	    merged.AddRange(nums1);
	   	merged.AddRange(nums2);
	    merged.Sort();
        if (merged.Count % 2 == 0) {
            var item1 = merged.ElementAt(merged.Count/2);
            var item2 = merged.ElementAt(merged.Count/2 - 1);
            return ((double)(item1+item2))/2;
        } else {
            return merged.ElementAt((int)(merged.Count/2));
        }
    }

Solution 2 (Only C# data structure is different)

public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
        var mergedArray = nums1.Concat(nums2).ToArray();
	   Array.Sort(mergedArray);
	   if (mergedArray.Length % 2 == 0) {
		   var item1 = mergedArray.ElementAt(mergedArray.Length/2);
		   var item2 = mergedArray.ElementAt(mergedArray.Length/2 - 1);
		   return (((double)(item1+item2))/2);
	   } else {
		   return mergedArray.ElementAt((int)(mergedArray.Length/2));
	   }
    }

Solution 3

public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
        // iterate through nums1 and nums2
        // get to the mid values in iteration
        // and return the median
        var medianAt = (nums1.Length + nums2.Length) / 2;
        var evenLength = (nums1.Length + nums2.Length) % 2 == 0;
        var iteratedOn1 = -1;
        var iteratedOn2 = -1;
        var medianValues= new int[2];
        for (int i = 0; i <= medianAt; i++)
        {
            if (iteratedOn1 + 1 < nums1.Length || iteratedOn2 + 1 < nums2.Length)
            {
                if (iteratedOn1 + 1 < nums1.Length && iteratedOn2 + 1 < nums2.Length)
                {

                    if (nums1[iteratedOn1 + 1] <= nums2[iteratedOn2 + 1])
                    {
                        iteratedOn1++;
                        medianValues[0] = medianValues[1];
                        medianValues[1] = nums1[iteratedOn1];
                    }
                    else
                    {
                        iteratedOn2++;
                        medianValues[0] = medianValues[1];
                        medianValues[1] = nums2[iteratedOn2];
                    }
                } else if (iteratedOn1 + 1 < nums1.Length)
                {
                    iteratedOn1++;
                    medianValues[0] = medianValues[1];
                    medianValues[1] = nums1[iteratedOn1];
                } else if (iteratedOn2 + 1 < nums2.Length)
                {
                    iteratedOn2++;
                    medianValues[0] = medianValues[1];
                    medianValues[1] = nums2[iteratedOn2];
                }
            }
        }
        // get the values from iterated1 and iterated2
        return evenLength ? ((double)medianValues[0] + medianValues[1]) / 2 : medianValues[1];
    }

Solution 4 (More optimized version of 3)

 public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
        // iterate through nums1 and nums2
        // get to the mid values in iteration
        // and return the median
        var medianAt = (nums1.Length + nums2.Length) / 2;
        var evenLength = (nums1.Length + nums2.Length) % 2 == 0;
        var iteratedOn1 = -1;
        var iteratedOn2 = -1;
        var medianValues= new int[2];
        for (int i = 0; i <= medianAt; i++)
        {
            if (iteratedOn1 + 1 < nums1.Length || iteratedOn2 + 1 < nums2.Length)
            {
                if (iteratedOn1 + 1 < nums1.Length && iteratedOn2 + 1 < nums2.Length)
                {

                    if (nums1[iteratedOn1 + 1] <= nums2[iteratedOn2 + 1])
                    {
                        iteratedOn1++;
                        medianValues[0] = medianValues[1];
                        medianValues[1] = nums1[iteratedOn1];
                    }
                    else
                    {
                        iteratedOn2++;
                        medianValues[0] = medianValues[1];
                        medianValues[1] = nums2[iteratedOn2];
                    }
                } else if (iteratedOn1 + 1 < nums1.Length)
                {
                    iteratedOn1++;
                    medianValues[0] = medianValues[1];
                    medianValues[1] = nums1[iteratedOn1];

                    // We may skip further iterations.
                    // because further iterations will only run this block
                    var iterationsRemaining = medianAt - i;
                    // Find the next value
                    if (iteratedOn1 != iteratedOn1 + iterationsRemaining)
                    {
                        iteratedOn1 += iterationsRemaining;
                        medianValues[0] = medianValues[1];
                        medianValues[1] = nums1[iteratedOn1];
                        if (iterationsRemaining > 1)
                        {
                            medianValues[0] = nums1[iteratedOn1-1];
                        }
                    }
                    break;
                }
                else if (iteratedOn2 + 1 < nums2.Length)
                {
                    iteratedOn2++;
                    medianValues[0] = medianValues[1];
                    medianValues[1] = nums2[iteratedOn2];

                    // We may skip further iterations.
                    // because further iterations will only run this block
                    var iterationsRemaining = medianAt - i;
                    if (iteratedOn2 != iteratedOn2 + iterationsRemaining)
                    {
                        iteratedOn2 += iterationsRemaining;
                        medianValues[0] = medianValues[1];
                        medianValues[1] = nums2[iteratedOn2];
                        if (iterationsRemaining > 1)
                        {
                            medianValues[0] = nums2[iteratedOn2-1];
                        }
                    }
                    break;
                }
            }
        }
        // get the values from iterated1 and iterated2
        return evenLength ? ((double)medianValues[0] + medianValues[1]) / 2 : medianValues[1];
    }

Leave a Reply

Your email address will not be published. Required fields are marked *

eighty two − seventy nine =