求中位數 每日一題04 尋找兩個有序陣列的中位數

2021-10-14 18:15:06 字數 1370 閱讀 8334

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

題目是求中位數,其實就是求第 k 小數的一種特殊情況,而求第 k 小數有一種演算法。我們一次遍歷就相當於去掉不可能是中位數的乙個值,也就是乙個乙個排除。由於數列是有序的,其實我們完全可以一半兒一半兒的排除。假設我們要找第 k 小數,我們可以每次迴圈排除掉 k/2 個數

我們比較兩個陣列的第 k/2 個數字,如果 k 是奇數,向下取整。也就是比較第 33 個數字,上邊陣列中的 44 和下邊陣列中的 33,如果哪個小,就表明該陣列的前 k/2 個數字都不是第 k 小數字,所以可以排除。也就是 11,22,33 這三個數字不可能是第 77 小的數字,我們可以把它排除掉。將 13491349 和 4567891045678910 兩個陣列作為新的陣列進行比較。

更一般的情況 a[1] ,a[2] ,a[3],a[k/2] ... ,b[1],b[2],b[3],b[k/2] ... ,如果 a[k/2]

a 陣列中比 a[k/2] 小的數有 k/2-1 個,b 陣列中,b[k/2] 比 a[k/2] 小,假設 b[k/2] 前邊的數字都比 a[k/2] 小,也只有 k/2-1 個,所以比 a[k/2] 小的數字最多有 k/1-1+k/2-1=k-2個,所以 a[k/2] 最多是第 k-1 小的數。而比 a[k/2] 小的數更不可能是第 k 小的數了,所以可以把它們排除。

所以我們採用遞迴的思路,為了防止陣列長度小於 k/2,所以每次比較 min(k/2,len(陣列) 對應的數字,把小的那個對應的陣列的數字排除,將兩個新陣列進入遞迴,並且 k 要減去排除的數字的個數。遞迴出口就是當 k=1 或者其中乙個數字長度是 0 了。

public double findmediansortedarrays(int nums1, int nums2)   private int getkth(int nums1, int start1, int end1, int nums2, int start2, int end2, int k)  else  }每天進步1%,堅持學習。只要你一刻不停,堅持下去,你將難以想象自己能取得多麼偉大的成就。歡迎和椰子一起交流,克服懶惰。

leetCode每日一題 尋找中位數

給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。分析 單看題目尋找中位數而言,可以簡化為尋找兩個數列中的第n位數字,可以通過利用指標...

04尋找兩個陣列的中位數

from typing import list class solution def findmediansortedarrays self,nums1 list int nums2 list int float 這樣寫可以不用判斷兩個陣列和為奇數和偶數的情況 index1 len nums1 le...

04 尋找兩個有序陣列的中位數

c 語法 參考文獻 給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 可以假設nums1和nums2不會同時為空 example nums1 1,3 nums2 2 return 中位數是 2.0最初的版本...