median of two sorted arrays

后端 未结 10 639
南旧
南旧 2020-12-16 19:12

My question is with reference to Method 2 of this link. Here two equal length sorted arrays are given and we have to find the median of the two arrays merged.



        
10条回答
  •  醉话见心
    2020-12-16 20:01

    Javascript solution to finding median of two sorted arrays:

    const findMedian = (arr1, arr2) => {
      const len = arr1.length + arr2.length;
      return len % 2 ? oddMedian(Math.floor(len/2), arr1, arr2) : evenMedian((len/2)-1, len/2, arr1, arr2);
    }
    
    const oddMedian = (medianIndex, arr1, arr2) => {
      if (arr1[arr1.length-1] < arr2[0]) {
        if (arr1.length > medianIndex) {
          return arr1[medianIndex];
        } else if (arr1.length <= medianIndex) {
          return arr2[medianIndex - arr1.length];
        }
      } else if (arr2[arr2.length-1] < arr1[0]) {
        if (arr2.length > medianIndex) {
          return arr2[medianIndex];
        } else if (arr2.length <= medianIndex) {
          return arr1[medianIndex - arr2.length];
        }
      } else {
        const [shorterArr, largerArr] = arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];
        let j = 0;
        let k = 0;
        const sortedArr = [];
        for (let i = 0; i <= medianIndex; i++) {
          if (shorterArr[j] <= largerArr[k]) {
            sortedArr[i] = shorterArr[j];
            j++;
          } else {
            sortedArr[i] = largerArr[k];
            k++;
          }
        }
        return sortedArr[medianIndex];
      }
    }
    
    const evenMedian = (medianIndex1, medianIndex2, arr1, arr2) => {
      if (arr1[arr1.length-1] < arr2[0]) {
        if (arr1.length-1 >= medianIndex2) {
          return (arr1[medianIndex1]+arr1[medianIndex2])/2;
        } else if (arr1.length-1 < medianIndex1) {
          const firstMedianIndex = medianIndex1 - arr1.length;
          return (arr2[firstMedianIndex]+arr2[firstMedianIndex+1])/2;
        } else {
          return (arr1[arr1.length-1] + arr2[0])/2;
        }
      } else if (arr2[arr2.length-1] < arr1[0]) {
        if (arr2.length-1 >= medianIndex2) {
          return (arr2[medianIndex1]+arr2[medianIndex2])/2;
        } else if (arr2.length-1 < medianIndex1) {
          const firstMedianIndex = medianIndex1 - arr2.length;
          return (arr1[firstMedianIndex]+arr1[firstMedianIndex+1])/2;
        } else {
          return (arr2[arr2.length-1] + arr1[0])/2;
        }
      } else {
        const [shorterArr, largerArr] = arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];
        let i = 0;
        let j = 0;
        let k = 0;
        const sortedArr = [];
        for (let i = 0; i <= medianIndex2; i++) {
          if (shorterArr[j] <= largerArr[k]) {
            sortedArr.push(shorterArr[j]);
            j++;
          } else {
            sortedArr.push(largerArr[k]);
            k++;
          }
        }
        return (sortedArr[medianIndex1] + sortedArr[medianIndex2])/2;
      }
    }
    

    Example

    console.log("Result:", findMedian([1,3,5], [2,4,6,8]));
    console.log("Result:", findMedian([1,3,5,7,10], [2,4,6,8]));
    console.log("Result:", findMedian([1,3,5,7,10], [2,4,6,8,9]));
    console.log("Result:", findMedian([1,3,5], [2,4,6,8,9]));
    console.log("Result:", findMedian([1,3,5,7], [2,4,6,8,9,10]));
    console.log("Result:", findMedian([1,3,5,7,10], [2,4,6]));
    console.log("Result:", findMedian([1,3,5,7], [2,4]));
    console.log("Result:", findMedian([1,2,4], [3,5,6,7,8,9,10,11]));
    console.log("Result:", findMedian([1], [2, 3, 4]));
    console.log("Result:", findMedian([1, 2], [3, 4]));
    console.log("Result:", findMedian([1], [2, 3]));
    

    Output

    Result: 4
    Result: 5
    Result: 5.5
    Result: 4.5
    Result: 5.5
    Result: 4.5
    Result: 3.5
    Result: 6
    Result: 2.5
    Result: 2.5
    Result: 2
    

提交回复
热议问题