leetcode 4. Median of Two Sorted Arrays 尋找兩個正序陣列的中位數(困難)

okokabcd發表於2022-05-30

一、題目大意

標籤: 查詢

https://leetcode.cn/problems/median-of-two-sorted-arrays

給定兩個大小分別為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的 中位數 。
演算法的時間複雜度應該為 O(log (m+n)) 。

示例 1:

輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合併陣列 = [1,2,3] ,中位數 2

示例 2:

輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5

提示:

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

二、解題思路

號稱leetcode守門員的題。中位數可以來自於同一個陣列,也可以來自於兩個陣列,可以是一個數,也可以是兩個數。
實現思路(參考花花醬的講解)
分類:

思路:假設n1,n2是兩個陣列的元素,那麼k=(n1+n2+1)/2就表示左中位數或中位數的索引,假設從nums1中取m1個元素,從nums2中取m2個元素,那麼m1+m2 = k。我們要求的中位數就是從max(nums[m1-1], nums[m2-1])和min(nums[m1], nums[m2])。

三、解題方法

3.1 Java實現

public class Solution2 {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n1 = nums1.length;
        int n2 = nums2.length;
        // 對長度小的陣列做二分搜尋
        if (n1 > n2 ) {
            return findMedianSortedArrays(nums2, nums1);
        }

        // 偶數情況:nums1=>[1, 2, 3] nums2=>[3, 4, 5]  中位數 2 3
        // 奇數情況:nums1=>[1, 2, 3] nums2=>[2, 3, 4, 5] 中位數 3
        // nums1=>[-1, 1, 3, 5, 7, 9] nums2=>[2, 4, 6, 8, 10, 12, 14, 16]
        int l = 0;
        int r = n1;
        // 偶數情況:左中位數 奇數情況:中位數
        int k = (n1 + n2 + 1) / 2;
        while (l < r) {
            int m1 = l + (r - l) / 2;
            int m2 = k - m1;
            if (nums1[m1] < nums2[m2-1]) {
                l = m1 + 1;
            } else {
                r = m1;
            }
        }
        int m1 = l;
        int m2 = k - l;

        int c1 = Math.max(m1 < 1 ? Integer.MIN_VALUE : nums1[m1-1], m2 < 1 ? Integer.MIN_VALUE : nums2[m2-1]);
        // 奇數情況
        if ((n1 + n2) % 2 == 1) {
            return c1;
        }

        int c2 = Math.min(m1 >= n1 ? Integer.MAX_VALUE : nums1[m1], m2 >= n2 ? Integer.MAX_VALUE : nums2[m2]);
        return (c1 + c2) * 0.5;
    }
}

四、總結小記

  • 2022/5/30 做不出來的題就參考別人的吧,再轉為自己的思路吧

相關文章