Median of Two Sorted Arrays

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)).
有兩個有序的數組num1和num2,容量分別為m,n。找到兩個數組的中位數。整個的時間復雜度應該為O(log(m+n)).

解:

求中位數,則應該分別考慮m+n的 奇偶性,然后調用一個函數,返回兩個向量合并成一個有序序列,的第k個值。
接下來我們主要的任務就是寫出這個函數。
我們不妨設n<=m,因為兩個數組可以互換順序,不影響結果。我們在num1數組中找到第p=min(k/2,n)個數a,在num2中找到第k-p的數b。相比較:如果a>b,那么我們可以確定我們最終要找的數載b之后,則我們重新確定num2數組(去掉包括b之前的元素),遞歸尋找第k-p個數,反之同理。這事我們再確定結束條件,當其中一個數組為空的時候,直接返回另一個數組第k個數。當k等于1的時候返回min(num1[0],num[0])
代碼如下(C++)
class Solution { public: //尋找兩個數組如果合并為一個有序數組之后的第k個數。 int ans(vector<int>& nums1,vector<int>& nums2,int k){ int n = nums1.size(); int m = nums2.size(); if(n > m){ return ans(nums2,nums1,k); } if(n == 0) return nums2[k-1]; if(k == 1) return min(nums1[0],nums2[0]); int pa = min(k/2,n),pb = k - pa; if(nums1[pa - 1] < nums2[pb - 1] ){ vector<int> a(nums1.begin() + pa, nums1.end()); return ans(a,nums2,k - pa); } else if(nums1[pa - 1] > nums2[pb - 1]){ vector<int> b(nums2.begin() + pb,nums2.end()); return ans(nums1,b,k - pb); } else return nums1[pa-1]; } double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n = nums1.size(); int m = nums2.size(); int k = (n + m)/2; if((m + n)%2){ return ans(nums1,nums2,k + 1); } else { return (ans(nums1,nums2,k) + ans(nums1,nums2,k+1))/2.0; } }
時間復雜度因為通過遞歸,為O(log(m+n))。
空間復雜度為O(1)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容