1. 程式人生 > 其它 >LeetCode4. 尋找兩個正序陣列的中位數

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

題目

分析

此題目轉換為求兩個有序陣列的第 K 小的數

參考 https://www.acwing.com/solution/content/50/

程式碼

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
 4         int tol = nums1.size() + nums2.size();
 5         //判斷奇數還是偶數,若為奇數就返回中間的那個,若為偶數就返回中間兩數之和
 6
if(tol % 2 == 0){ 7 int left = find(nums1,0,nums2,0,tol / 2); 8 int right = find(nums1,0,nums2,0,tol / 2 + 1); 9 return (left + right ) / 2.0; 10 }else{ 11 return find(nums1,0,nums2,0,tol / 2 + 1); 12 13 } 14 } 15 16 //將本問題轉換為在兩個陣列中尋求第 K 小數
17 int find(vector<int> &nums1,int i ,vector<int>&nums2,int j,int k){ 18 //預設nums1 陣列的長度 < nums2 陣列的長度 19 if(nums1.size() - i > nums2.size() - j) return find(nums2,j,nums1,i,k); 20 21 //邊界判斷 22 //1.若 K 為 第一小的數 23 if(k == 1){ 24 //
若nums1為空,返回nums2的第一個元素 25 if(nums1.size() - i == 0) return nums2[j]; 26 else return min(nums1[i],nums2[j]); //nums1不為空 27 } 28 29 //2. 若nums1 為空,從 nums2裡面找 30 if(nums1.size() - i == 0) return nums2[j + k -1]; //因為 K 的取值是從 1 開始的所以要 - 1 31 32 int si = min((int)nums1.size(),i + k/2),sj = j + k - k/2; //si 要取最小,否則可能會越界 33 if(nums1[si -1] > nums2[sj - 1] ) return find(nums1,i,nums2,j + k/2,k - k/2); 34 else{ 35 return find(nums1,si,nums2,j,k -(si - i)); 36 } 37 38 } 39 };

時間複雜度 O (log(m + n ))