給定兩個大小為 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最初的版本...