LeetCode——尋找兩個有序數組的中位數

題目:

給定兩個大小爲 m 和 n 的有序數組 nums1 和 nums2。

請你找出這兩個有序數組的中位數,並且要求算法的時間複雜度爲 O(log(m + n))。

你可以假設 nums1 和 nums2 不會同時爲空。

示例 1:

nums1 = [1, 3]

 nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

 則中位數是 (2 + 3)/2 = 2.5

 

思路:

題目中限制了算法的時間複雜度爲O(log(m + n)),就要求我們在最多在一次遍歷中將兩個數組聯合排序

由於是兩個有序數組,直接從前面開始比較就可以。

定義sorted爲排序後的數組,分別使用 i, j標記num1,num2當前比較的數字索引,將較小的數字填入sorted,知道其中一個數組全部併入到sorted中,然後將剩餘的數組拼接在sorted後面,最後只要取中位數就可以了。

代碼如下:

var findMedianSortedArrays = function(nums1, nums2) {
    let sorted = [], len1 = nums1.length, len2 = nums2.length;
    if(len1 === 0 || len2 === 0){
        sorted = nums1.concat(nums2)
    }else{
        let i = 0, j = 0;
        while(i<len1 && j<len2){
            if(nums1[i] <= nums2[j]){
                sorted.push(nums1[i]);
                i++;
            }else{
                sorted.push(nums2[j]);
                j++
            }
        }
        if(i === len1){
            sorted = sorted.concat(nums2.slice(j))
        }
        if(j === len2){
            sorted = sorted.concat(nums1.slice(i))
        }
    }
    return (len1+len2)%2==0?(sorted[(len1+len2)/2]+sorted[(len1+len2)/2-1])/2:sorted[Math.ceil((len1+len2)/2)-1];
};

代碼地址:github地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章