題目描述:
給定兩個大小為 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
(此題解參考leetcode上的大佬的解法,但是邊界問題處理的心情十分煩躁?)
題解:1,題目是求中位數,其實就是求第 k 小數的一種特殊情況,而求第 k 小數有一種演算法。
2,假設我們要找第 k 小數,我們可以每次迴圈排除掉 k/2 個數。
3,例如假設我們要找第 7 小的數字。
我們比較兩個陣列的第 k/2 個數字,如果 k 是奇數,向下取整。也就是比較第 3 個數字,上邊陣列中的 4 和下邊陣列中的3,如果哪個小,就表明該陣列的前 k/2 個數字都不是第 k 小數字,所以可以排除。也就是 1,2,3 這三個數字不可能是第 7小的數字,我們可以把它排除掉。將 1349和 45678910 兩個陣列作為新的陣列進行比較。
更一般的情況 a[1] ,a[2] ,a[3],a[k/2] … ,b[1],b[2],b[3],b[k/2] … ,如果 a[k/2] 4 吧,所以此時將下邊的 4 去掉。
由於又去掉 1 個數字,此時我們要找第 1 小的數字,所以只需判斷兩個陣列中第乙個數字哪個小就可以了,也就是 4。
所以第 7 小的數字是 4。
我們每次都是取 k/2 的數進行比較,有時候可能會遇到陣列長度小於 k/2的時候。
此時 k / 2 等於 3,而上邊的陣列長度是 2,我們此時將箭頭指向它的末尾就可以了。這樣的話,由於 2 < 3,所以就會導致上邊的陣列 1,2 都被排除。造成下邊的情況。
由於 2 個元素被排除,所以此時 k = 5,又由於上邊的陣列已經空了,我們只需要返回下邊的陣列的第 5 個數字就可以了。
從上邊可以看到,無論是找第奇數個還是第偶數個數字,對我們的演算法並沒有影響,而且在演算法進行中,k 的值都有可能從奇數變為偶數,最終都會變為 1 或者由於乙個陣列空了,直接返回結果。
class
solution
else
if(l2>=len2)}if
((len1+len2)%2
==0)else}}
;
leetcode尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
LeetCode 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
二 Leetcode演算法尋找兩個有序陣列的中位數
1 題目 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。nums1 1,3 nums2 2 則中位數是 2.0 nums1 1,2 nums2...