leetcode每日一題 leetcode4

在這裏插入圖片描述
這道題自己首先想到的就是利用歸併排序的感覺,用兩個指針分別掃描兩個數組,查找中間元素

自己寫的代碼竟然超時了。。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

        bool whetherodd = true;
        bool iorj = true; //true表示最後一次移動爲i

        int length = nums1.size() + nums2.size();
        int n = 0;
        if((length & 1 ) == 0 ) whetherodd = false;

        n = length / 2;

        int times = 0;

        int i = 0 , j = 0;
        while( times != n + 1 && i < nums1.size() && j < nums2.size() ){ //n + 1比較好追溯上一個移動的

            if( nums1[i] <= nums2[j]) i++;
            else{
                j ++; iorj = false;
            }

            times ++;

        }

        if(times == n + 1){
            if(whetherodd == true ){
                if(iorj == false )
                    return nums2[j - 1];
                else
                    return nums1[i - 1];
            } else{
                if(iorj == false )
                    return ((double)nums2[j - 1] + (double)nums2[j] ) / 2;
                else
                    return ((double)nums1[i - 1] + (double)nums1[i] ) / 2;
                }
            }else if(i == nums1.size()){
            while(times != n + 1 ){
                j ++;
                times ++;

            }
            if( whetherodd == true ) return nums2[ j - 1 ];
            else if( nums1.size() == nums2.size() )
                    return ((double)nums2[j - 1] + (double)nums1[i-1] ) / 2;
                else
                    return ((double)nums2[j - 1] + (double)nums2[j] ) / 2; //這裏如果其長度一樣就出錯了

        }else if( j == nums2.size()){
            while(times != n + 1 ){ i ++; times ++; }
            if( whetherodd == true ) return nums2[ i - 1 ];
            else if( nums1.size() == nums2.size() )
                return ((double)nums2[i - 1] + (double)nums1[j-1] ) / 2;
            else
                return ((double)nums2[i - 1] + (double)nums2[i] ) / 2;
        }


    return 0.0;
    }
};

明後天複試,沒有時間康了,先搬運一下bobo老師的答案 ,複試完來填坑

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

        if(nums1.size() > nums2.size()) swap(nums1, nums2);

        int n = nums1.size(), m = nums2.size();
        if(n == 0) return m % 2 ? nums2[m / 2] : (nums2[m / 2 - 1] + nums2[m / 2]) / 2.0;
        int half = (n + m) / 2;

        int l = 0, r = n;
        while(l <= r){
            int mid = (l + r) / 2;

            int i1 = mid, i2 = half - i1;

            int leftMax = i1 == 0 ? nums2[i2 - 1] :
                          i2 == 0 ? nums1[i1 - 1] : max(nums1[i1 - 1], nums2[i2 - 1]);
            int rightMin = i1 == n ? nums2[i2] :
                           i2 == m ? nums1[i1] : min(nums1[i1], nums2[i2]);

            if(leftMax <= rightMin){
                if((n + m) % 2 == 1)
                    return rightMin;
                else{
                    int nums1Left = i1 == 0 ? INT_MIN :
                                    i1 == 1 ? nums1[i1 - 1] : max(nums1[i1 - 1], nums1[i1 - 2]);
                    int nums1Right = i1 == n ? INT_MAX :
                                     i1 == n - 1 ? nums1[i1] : min(nums1[i1], nums1[i1 + 1]);
                    int nums2Left = i2 == 0 ? INT_MIN :
                                    i2 == 1 ? nums2[i2 - 1] : max(nums2[i2 - 1], nums2[i2 - 2]);
                    int nums2Right = i2 == m ? INT_MAX :
                                     i2 == m - 1 ? nums2[i2] : min(nums2[i2], nums2[i2 + 1]);
                    return (max(nums1Left, nums2Left) + min(nums1Right, nums2Right)) / 2.0;
                }
            }
            else if(nums1[i1] == rightMin)
                l = mid + 1;
            else
                r = mid - 1;
        }
        assert(false);
        return -1;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章