week1

Median of Two Sorted Arrays (from leetCode)

A.題意

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,然後你找出這兩個數組中所有數的中位數,要求的算法時間複雜度爲O(log (m+n))。

B.思路

由兩個數組已經排序好,並且對時間要求複雜度爲O(log (m+n))我們很容易想到類比于歸並排序的思路,我們只需要一個變量計數到中間位置,然後類似於歸併排序思路把中位數找出來即可,每一次循環若數組nums1當前位置數字小於nums2當前位置數字則移動nums1當前位置,反之移動nums2.

C.代碼實現

代碼實現這裏有一些臨界的小細節一開始沒考慮,所以這裏寫的有些小亂。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int all = nums1.size() + nums2.size();
        if(nums1.size() == 0) //處理nums1爲空的情況
        {
            int size = nums2.size();
            if(size % 2 == 0)
                return (nums2[size / 2] + nums2[size / 2 - 1]) / 2.0;
            else
                return (double)nums2[size / 2];
        }
        if(nums2.size() == 0) //處理nums2爲空的情況
        {
            int size = nums1.size();
            if(size % 2 == 0)
                return (nums1[size / 2] + nums1[size / 2 - 1]) / 2.0;
            else
                return (double)nums1[size / 2];
        }
        double ans;
        int num[2] = {0, 0}; //用來儲存最近遍歷的兩個數字
        int j = 0, k = 0;
        for (int i = 0; i <= all / 2; i++)
        {
            if (nums1[j] <= nums2[k] && j < nums1.size())
            {
                num[0] = num[1];
                num[1] = nums1[j]; // 把大的數字放後面
                j++;
            }
            else if (nums1[j] > nums2[k] && k < nums2.size())
            {
                num[0] = num[1];
                num[1] = nums2[k]; // 把大的數字放後面
                k++;
            }
            else if (k >= nums2.size()) // 當nums2已經遍歷完的情況
            {
                num[0] = num[1];
                num[1] = nums1[j];
                j++;
            }
            else if (j >= nums1.size()) // 當nums1已經遍歷完的情況
            {
                num[0] = num[1];
                num[1] = nums2[k];
                k++;
            }
        }
        if (all % 2 == 0)
            ans = (num[0] + num[1]) / 2.0;
        else
            ans = (double)num[1];
        return ans;
    }
};
發佈了24 篇原創文章 · 獲贊 0 · 訪問量 5046
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章