【LeetCode】 騰訊—— 兩個排序數組的中位數

1.題目

給定兩個大小爲 m 和 n 的有序數組 nums1 和 nums2 。
請找出這兩個有序數組的中位數。要求算法的時間複雜度爲 O(log (m+n)) 。
你可以假設 nums1 和 nums2 不同時爲空

點擊跳轉原題

2.代碼

public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len=nums1.size()+nums2.size();
	int arr[len];
	int i,j;
	for(i=0;i<nums1.size();i++){
		arr[i]=nums1[i];
	}
	for(j=0;j<nums2.size();j++){
		arr[i++]=nums2[j];
	}
	sort(arr,arr+len);
	if(len%2==0)
		return (double)(arr[len/2-1]+arr[len/2])/2;
	else
		return arr[len/2];
    }
};

3.優秀案例

class Solution {
public:
    double findMedianSortedArrays(vector<int>& A, vector<int>& B) {
        
        int m=A.size(), n=B.size();
        
        if(m>n) {swap(A, B); swap(m, n);}
        
        int i, j, left=0, right=m;  //  for total odd elements, left side has i more
        int tt=m+n+1;
        
            while(left<=right) {
            
            i=(left+right) >> 1;
            j = (tt >> 1) - i;
            
            if(i<m && B[j-1]>A[i]) left = i+1;          //  i is too small
            
            else if(i>0 && A[i-1]>B[j]) right = i-1;    //  i is too big
            
            else {
                int leftMax, rightMin;
                
                if(i == 0) leftMax = B[j-1];
                else if(j == 0) leftMax = A[i-1];
                else leftMax = max(A[i-1], B[j-1]);
                
                if((m+n)%2) return leftMax;
                
                if(i == m) rightMin = B[j];
                else if(j == n) rightMin = A[i];
                else rightMin = min(A[i], B[j]);
                
                return (leftMax + rightMin)/2.0;                
            }            
        }        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章