1. 程式人生 > >【LeetCode 4. Median of Two Sorted Arrays】兩個有序陣列的中位數求解

【LeetCode 4. Median of Two Sorted Arrays】兩個有序陣列的中位數求解

一、題目描述

給定兩個已經排好序的陣列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;
    }
};