【LeetCode 4. Median of Two Sorted Arrays】兩個有序陣列的中位數求解
阿新 • • 發佈:2019-02-16
一、題目描述
給定兩個已經排好序的陣列nums1和nums2,長度分別是m和n,要求求出這兩個有序數組合並後的新陣列中的中位數,並要求整個程式實現的時間複雜度為O(log(m+n))。例如陣列1 nums1=[1,3],給定的陣列2為 nums2=[2],則輸出陣列[1,2,3]的中位數2.0,若是[1,2]和[3,4],則輸出中位數2.5。
二、思路解析
這道題的難點在於控制時間複雜度,由於要求的時間複雜度為O(m+n),因此只能遍歷兩個陣列一遍。本人採取的做法是歸併排序中的思想,即在兩個陣列中的頭部設定一個指標a,b,以及新建一個新陣列temp,temp用於儲存兩數組合並後的新陣列值。每次比較指標a和b的值,若a比b小,則將a指標的值存進temp陣列,a指標往前一位,計數k加1,反之亦然。k的值也即為temp陣列中所儲存的元素的數量,當k等於兩陣列長度和的一半時,此時進行判斷,若m+n為奇數,則輸出temp[k],否則輸出(temp[k]+temp[k-1])/2。可以說,在理解了歸併排序的思想後去解決此題,可以有效的得到答案。
三、程式碼實現
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { double out; int i = 0, j = 0; int length; vector<double> temp(1000); length = nums1.size() + nums2.size(); int mid = (nums1.size() + nums2.size()) / 2; int flag = (nums1.size() + nums2.size()) % 2; if(nums2.size() == 0 && (nums1.size() % 2) == 0) { temp[0] = nums1[mid]; temp[1] = nums1[mid - 1]; out = (temp[0] + temp[1]) / 2; return out; } else if(nums2.size() == 0 && (nums1.size() % 2) == 1) { return nums1[mid]; } if(nums1.size() == 0 && (nums2.size() % 2) == 0) { temp[0] = nums2[mid]; temp[1] = nums2[mid - 1]; out = (temp[0] + temp[1]) / 2; return out; } else if(nums1.size() == 0 && (nums2.size() % 2) == 1) { return nums2[mid]; } for(int k = 0; k < length; k++) { if(nums1[i] <= nums2[j] && i < nums1.size()) { temp[k] = nums1[i]; i++; } else if(nums2[j] <= nums1[i] && j < nums2.size()) { temp[k] = nums2[j]; j++; } else if(j >= nums2.size()){ temp[k] = nums1[i]; i++; } else if(i >= nums1.size()){ temp[k] = nums2[j]; j++; } if((flag == 1) && (k == mid)) { out = temp[k]; break; } else if((flag == 0) && (k == mid)) { out = (temp[k] + temp[k - 1]) / 2; break; } } return out; } };