## 解題思路
這道題目初看挺簡單的,一早就能想到用二分查詢解法,但是要找到乙個清晰的邊界條件,實在讓人痛苦
在測試用例中,總有那麼乙個直擊**的軟肋,讓程式的結果與正確答案失之交臂。
網上看到現成的解法使用各種技巧,從結果上,並不容易理解,這裡給出乙個樸素的解法
## 常規思路
有乙個都能想到的基本思路是,對陣列進行分割,然後,丟棄不包含中值的部分,問題出在一些邊界條件上,分割的時候意外的把中值給割出去了,這裡的解決思路就是放鬆分割的邊界,避免誤割,後面再談
對於陣列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...