題目描述:
給定兩個大小為 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
方法1:二分查詢的變形
主要思路:
(1)常用的二分查詢是在整個範圍內查詢,每次找到範圍中的中間位置,拿中間位置和某個條件比較,再決定是縮小左右那個邊界,重複進行,直到找到需要的目標值;
(2)本題是要在兩個有序陣列中找到中位數,故變形為找第 k 個值,對於兩個陣列的元素是奇數個的,直接找中間位置,對於兩個陣列元素和是偶數個的,找到中間相鄰的兩個值之後,求平均即可;
(3)下面就是如何在兩個有序陣列中找第 k 個值的問題,這裡就有點像是二分查詢的變形了:對於第 k 個數,可以先分別在兩個陣列的前 k/2個數中的數值進行判斷,若陣列1的第 k/2 個元素小於等於陣列2 的第 k/2 個元素,則說明可以排除掉陣列1的 前 k/2 個元素,反之,排除陣列2 的前 k/2 個元素,然後對應的更新兩個陣列的新的起始位置,及需要判斷的新的 k 的位置,既第 k-k/2個,然後重新判斷;
(4)需要注意的是,在生成新的陣列的起始位置時,要避免越界的情形;
(5)在返回結果時,分為三種情形,一種是陣列 1 已經遍歷完,則直接在陣列 2 中返回對應第 k 個元素,一種是陣列 2 已經遍歷完,則直接在陣列 1 中返回對應的第 k 個元素,最後一種是 k 等於 1 時,只需要返回兩個陣列中的首位中的較小值即可;
class
solution
else}}
double
findmediansortedarrays
(vector<
int>
& nums1, vector<
int>
& nums2)
else}}
;
4 尋找兩個正序陣列的中位數
思路 我現在還沒有進行優化,大概就是合併陣列 參照之前的順序表合併 然後如果合併陣列的大小sum是偶數,返回sum 2和sum 2 1兩個元素除以二,如果sum是奇數則直接返回sum 2的元素 double findmediansortedarrays int nums1,int nums1size...
4 尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列nums1和nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nu...
4 尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums...