尋找兩個有序陣列的中位數(放鬆邊界條件的樸素解法)

2021-10-25 11:32:23 字數 2244 閱讀 5376

## 解題思路

這道題目初看挺簡單的,一早就能想到用二分查詢解法,但是要找到乙個清晰的邊界條件,實在讓人痛苦

在測試用例中,總有那麼乙個直擊**的軟肋,讓程式的結果與正確答案失之交臂。

網上看到現成的解法使用各種技巧,從結果上,並不容易理解,這裡給出乙個樸素的解法

## 常規思路

有乙個都能想到的基本思路是,對陣列進行分割,然後,丟棄不包含中值的部分,問題出在一些邊界條件上,分割的時候意外的把中值給割出去了,這裡的解決思路就是放鬆分割的邊界,避免誤割,後面再談

對於陣列1和陣列2,長度分別為m和n

分別設定(l1,r1)和(l2,r2),分別表示目前陣列中保留的部分,其餘為割出去的部分

pos = (l+r)/2 表示陣列保留部分的中值(只是近似)

初始如下

更新l和r

相信大部分人都能想到這一點,但是這樣做存在風險的,這個後面再談

停止條件

想象一下,我們把從兩個陣列合併到乙個有序的全數陣列裡面看

pivot1和pivot2就是要找的中值位置,m+n為奇數時重合,偶數的時候不同

l代表了保留下的資料在全資料陣列的起始位置,r代表結束位置,可以根據(l1,l2,r1,r2)計算得到

那麼只要停止條件設定為 l==pivot1或者 r == pivot2

## 放寬丟棄條件

目標點pivot1和pivot2

上面幾步對邊界處理有問題,極端的情況下面會將中值資料割出去

所有在每次分割的時候,放鬆邊界條件,保證不把中值資料提出去

下面是幾處邊界處理的方法

l和r的更新,更新後,增大保留的部分,l = l -1, r = r+1;

l 或 r只有靠近pivot就可以停止切割了,從全陣列的角度,向右或者向左搜尋目標點

搜尋時,為了確保中值資料沒有被割出去,適當擴大保留資料範圍

r靠近pivot2時,從右邊開始找,依次找兩個陣列中,保留資料裡最大的資料,直到找到pivot1,pivot2對應的資料

類似地,l靠近pivot2時,從左邊找保留資料裡面最小的

下面的**沒什麼價值,純屬拋磚引玉,大家完全可以自己實現乙個。

/*

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

*/#includeusing namespace std;

// @lc code=start

#define middle_result(x,len) (len)%2==0?((double)x[(len)/2]+x[(len)/2-1])/2:x[(len)/2]

//從右開始搜尋,找到全陣列裡面位於target位置的點

int rightdriectsearch(vector&nums1, int r1,vector&nums2,int r2, int target)

int l = (m+n-1)-(m-1-r1)-(n-r2-1);int val1=0,val2=0;

while(l>=target)

return val2>val1?val2:val1;

}//從左開始搜尋,找到全陣列裡面位於target位置的點

int leftdriectsearch(vector&nums1, int l1,vector&nums2,int l2, int target)

int l = l1+l2;int val1=0,val2=0;

while(l<=target)else if((r-3)<=pivot2)

//更新保留資料的邊界

int pos1 = (l1 + r1) / 2;

int pos2 = (l2 + r2) / 2;

int mid1 = nums1[pos1];

int mid2 = nums2[pos2];

if (mid1 > mid2)

else

}

return 0.0;

}};// @lc code=end

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

尋找兩個有序陣列的中位數 user hihone date 2019 1 31 time 16 32 description 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 ...

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

思路 將兩個陣列排序,然後判斷陣列長度,長度為單數,則取二分之一處的數,否則取二分之一處和二分之一減一處的數之和除以2.var findmediansortedarrays function nums1,nums2 var mid math.floor arr.length 2 if arr.len...

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

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 n...