【LeetCode】 腾讯—— 两个排序数组的中位数

版权声明:made by YYT https://blog.csdn.net/qq_37621506/article/details/83826529

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;                
            }            
        }        
    }
};

猜你喜欢

转载自blog.csdn.net/qq_37621506/article/details/83826529