【LeetCode 4.】Median of Two Sorted Arrays

题目大意:

给两个有序数组,求出合并以后的中位数。
要求时间复杂度:O(m+n)

思路:

思路1:分别标记两个数组的移动位置,移动两个数组当前小的那个数字所在位置,直到移动到中位数所在位置。时间复杂度 O(n)。

思路2:二分。问题转化为求所有数字的第k小数,每次比较a[k/2-1]和b[k/2-1],如果两个数字相等,则找到第k小数。否则可以排除掉k/2个数字。时间复杂度 O(log(m+n))。这种思路的非递归版没看明白,递归版…比思路1时间花费还多。可能因为我的vector传参时每次都重新开辟。但是不知道怎么优化…

代码1:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        int totlen = len1 + len2;
        int m1 = 0, m2 = 0;
        
        if (totlen % 2) {
            m1 = totlen / 2;
            m2 = m1;
        }
        else {
            m1 = totlen / 2;
            m2 = m1 - 1;
        }
        
        int cnt = -1;
        int ans = 0;
        int i, j;
      
        for (i=0, j=0; i<len1 && j<len2; ) {
            int temp;
            if (nums1[i] < nums2[j]) {
                temp = nums1[i];
                i++;
                cnt++;
            }else {
                temp = nums2[j];
                j++;
                cnt++;
            }
            if (cnt == m1) {
                ans += temp;
            }
            if (cnt == m2) {
                ans += temp;
            }
        }
        
        if (cnt < m2 || cnt < m1) {
            while (i < len1) {
                cnt++;
                if (cnt == m2) {
                    ans += nums1[i];
                }
                if (cnt == m1) {
                    ans += nums1[i];
                }
                i++;
            }
            while (j < len2) {
                cnt++;
                if (cnt == m2) {
                    ans += nums2[j];
                }
                if (cnt == m1) {
                    ans += nums2[j];
                }
                j++;
            }
        }
        return ans * 1.0 / 2;
    }
};

代码2:

class Solution {
public:
    int dfs(vector<int> nums1, int len1, vector<int> nums2, int len2, int k) {
        if (len1 > len2) return dfs(nums2, len2, nums1, len1, k);
        if (len1 == 0) return nums2[k-1];
        if (len2 == 0) return nums1[k-1];
        if (k == 1) return min(nums1[0], nums2[0]);
        
        int ind1 = min(len1, k/2);
        int ind2 = k - ind1;
        
        if (nums1[ind1-1] < nums2[ind2-1]) return dfs(vector<int>(nums1.begin()+ind1, nums1.end()), len1-ind1, nums2, len2, k-ind1);
        else if (nums1[ind1-1] > nums2[ind2-1]) return dfs(nums1, len1, vector<int>(nums2.begin()+ind2, nums2.end()), len2-ind2, k-ind2);
        else return nums1[ind1-1];
    }
    
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        int totlen = len1 + len2;
        if (totlen % 2) return dfs(nums1, len1, nums2, len2, totlen/2 + 1);
        else return (dfs(nums1, len1, nums2, len2, totlen/2) + dfs(nums1, len1, nums2, len2, totlen/2+1)) * 1.0 / 2;
    }
};

一上午又只做了一道题。然后吃饭睡午觉就到了下午两点了…哎。
今天毕业生离校,好羡慕他们鸭。
虽然可能以后的我会怀念现在的日子。会吗?

猜你喜欢

转载自blog.csdn.net/iCode_girl/article/details/93737626