4 尋找兩個正序陣列的中位數

2021-10-08 10:32:08 字數 1189 閱讀 1153

題目描述:

給定兩個大小為 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...