4 - Median of Two Sorted Arrays

 JAVA

  • class Solution {
        private int m;
        private int n;
        private int[] nums1;
        private int[] nums2;
    
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            m = nums1.length;
            n = nums2.length;
            this.nums1 = nums1;
            this.nums2 = nums2;
            int a = f(0, 0, (m + n + 1) / 2);
            int b = f(0, 0, (m + n + 2) / 2);
            return (a + b) / 2.0;
        }
    
        private int f(int i, int j, int k) {
            if (i >= m) {
                return nums2[j + k - 1];
            }
            if (j >= n) {
                return nums1[i + k - 1];
            }
            if (k == 1) {
                return Math.min(nums1[i], nums2[j]);
            }
            int p = k / 2;
            int x = i + p - 1 < m ? nums1[i + p - 1] : 1 << 30;
            int y = j + p - 1 < n ? nums2[j + p - 1] : 1 << 30;
            return x < y ? f(i + p, j, k - p) : f(i, j + p, k - p);
        }
    }
C++

  • class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int m = nums1.size(), n = nums2.size();
            function<int(int, int, int)> f = [&](int i, int j, int k) {
                if (i >= m) {
                    return nums2[j + k - 1];
                }
                if (j >= n) {
                    return nums1[i + k - 1];
                }
                if (k == 1) {
                    return min(nums1[i], nums2[j]);
                }
                int p = k / 2;
                int x = i + p - 1 < m ? nums1[i + p - 1] : 1 << 30;
                int y = j + p - 1 < n ? nums2[j + p - 1] : 1 << 30;
                return x < y ? f(i + p, j, k - p) : f(i, j + p, k - p);
            };
            int a = f(0, 0, (m + n + 1) / 2);
            int b = f(0, 0, (m + n + 2) / 2);
            return (a + b) / 2.0;
        }
    };
JS

var findMedianSortedArrays = function (nums1, nums2) {
    const m = nums1.length;
    const n = nums2.length;
    const f = (i, j, k) => {
        if (i >= m) {
            return nums2[j + k - 1];
        }
        if (j >= n) {
            return nums1[i + k - 1];
        }
        if (k == 1) {
            return Math.min(nums1[i], nums2[j]);
        }
        const p = Math.floor(k / 2);
        const x = i + p - 1 < m ? nums1[i + p - 1] : 1 << 30;
        const y = j + p - 1 < n ? nums2[j + p - 1] : 1 << 30;
        return x < y ? f(i + p, j, k - p) : f(i, j + p, k - p);
    };
    const a = f(0, 0, Math.floor((m + n + 1) / 2));
    const b = f(0, 0, Math.floor((m + n + 2) / 2));
    return (a + b) / 2;
};

Comments