本部落格所用演算法是受另外一篇部落格所啟發,但該博主給出的**很多邊界條件和n+m為偶數的情況未考慮到,這裡我做了一定的完善。
原題如下:
there are two sorted arrays
nums1
and
nums2
of size m and n respectively. find the median of the two sorted arrays. the overall run time complexity should be o(log (m+n)).
大致意思是有兩個有序陣列nums1和nums2,長度分別為m和n,要求找到它們合併之後的中位數並且總共的是時間效率應該為o(log(m+n))。
先看看中位數的定義,乙個長度為n的陣列,如果n為奇數,則陣列中有(n-1)/2個元素比中位數小。如果n為偶數,則陣列張有n/2個元素比上中位數小,n/2-1個元素比下中位數小。
題目要求從nums1和nums2中找出中位數,我們可以先從nums1中查詢。先考慮n+m為奇數的情況,c=(m+n-1)/2,我們的查詢區間應該為[nums1[0],nums1[m-1]],我們取其中間的數nums1[p],與nums2[c-p-1]和nums2[c-p]做比較。
這裡需要注意的是,如果p>c,說明num1[p]偏大,我們應該調整查詢區間為[nums1[0],nums1[p-1]]。如果p==c,並且此時nums1[p]<=nums2[0],那麼nums1[p]就是我們所要找的中位數,否則查詢區間改為[nums1[0],nums1[p-1]]。
只剩下p
在n+m為偶數的情況,只需要把c加1,求兩次結果即可。
**如下,已通過測驗。本人剛學習c++,寫的可能比較繁瑣,望見諒。
double findmediansortedarrays(vector& nums1, vector& nums2)
else
}if (m == 0)
else
}if ((n + m) % 2 == 1)
else }
int findmedian(vector& nums1, vector& nums2, int begin, int end)
if (nums1[0] >= nums2[n - 1])
if (begin>end)
return findmedian(nums2, nums1, 0, n - 1);
if (c0)
else if(nums1[p]>=nums2[c-p-1]&&nums1[p]<=nums2[c-p])
return nums1[p];
else if(nums1[p]>nums2[c-p])
return findmedian(nums1, nums2, begin, p - 1);
}} }
else if(c==p) }
int findmedian_1(vector& nums1, vector& nums2, int begin, int end)
if (nums1[0] >= nums2[n - 1])
if (begin>end)
return findmedian_1(nums2, nums1, 0, n - 1);
if (c0)
else if(nums1[p]>=nums2[c-p-1]&&nums1[p]<=nums2[c-p])
return nums1[p];
else if(nums1[p]>nums2[c-p])
return findmedian_1(nums1, nums2, begin, p - 1);
}} }
else if(c==p)
}
求兩個等長有序陣列的中位數
設兩個有序陣列的長度均為n,求它們組成的2n長的陣列的中位數。首先說明下中位數的定義 統計學名詞,當變數值的項數n為奇數時,處於中間位置的變數值即為中位數 當n為偶數時,中位數則為處於中間位置的2個變數值的平均數。中位數有個性質 在中位數兩側去掉任意數量的數後,中位數不變 為了簡化,先假設n為奇數,...
求兩個等長有序陣列的中位數
兩個有序陣列的長度均為 n,求它們組成的 2n 長的陣列的中位數。中位數的定義 統計學名詞,當變數值的項數 n 為奇數時,處於中間位置的變數值即為中位數 當 n 為偶數時,中位數則為處於中間位置的 2 個變數值的平均數。中位數的性質 在中位數兩側去掉任意數量的數後,中位數不變。舉個例子 思路 找出將...
求兩個等長有序陣列的中位數的logN演算法 分治法
題目 有兩個長為n的非遞減陣列a和b,把b接在a的後面變成長為2n的陣列c。設計演算法求c的中位數 第n小數 思路 o n 的演算法很容易找到,關鍵是用二分的思想設計logn演算法。這題關鍵是用好a和b陣列中腳標和為定值的元素的大小關係。直觀想法是 如果中位數在陣列a中,那麼若a m b n m 1...