double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     int n = nums1.size() + nums2.size();
     if (n == 0) return 0;
     if (n % 2)
         return findMedianSortedArrays(nums1.begin(), nums1.size(), nums2.begin(), nums2.size(), n / 2 + 1);
     else
         return (findMedianSortedArrays(nums1.begin(), nums1.size(), nums2.begin(), nums2.size(), n / 2) + findMedianSortedArrays(nums1.begin(), nums1.size(), nums2.begin(), nums2.size(), n / 2 + 1)) / 2.0;
 }
 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     int total = nums1.size() + nums2.size();
     if (total % 2) {
         return findMedianSortedArrays(nums1, nums2, nums1.size(), nums2.size(), (total + 1) / 2);
     } else {
         return (findMedianSortedArrays(nums1, nums2, nums1.size(), nums2.size(), total / 2 + 1) +
                 findMedianSortedArrays(nums1, nums2, nums1.size(), nums2.size(), total / 2)) / 2;
     }
 }
 double findMedianSortedArrays(Iter iter1, int n1, Iter iter2, int n2, int k) {
     if (n1 > n2)
         return findMedianSortedArrays(iter2, n2, iter1, n1, k);
     if (n1 == 0) return *(iter2 + k - 1);
     if (k == 1) return min(*iter1, *iter2);
     int m1 = min(n1, k / 2), m2 = k - m1;
     if (*(iter1 + m1 - 1) < *(iter2 + m2 - 1))
         return findMedianSortedArrays(iter1 + m1, n1 - m1, iter2, n2, k - m1);
     else
         return findMedianSortedArrays(iter1, n1, iter2 + m2, n2 - m2, k - m2);
 }
예제 #4
0
파일: 4.c 프로젝트: josephok/leetcode
int main(int argc, char const *argv[]) {
    int nums1[] = {1, 3};
    int nums2[] = {2};
    double median1 = findMedianSortedArrays(nums1, 2, nums2, 1);
    printf("%lf\n", median1);
    assert(median1 == 2.0);

    int nums3[] = {1, 2};
    int nums4[] = {3, 4};
    double median2 = findMedianSortedArrays(nums3, 2, nums4, 2);
    printf("%lf\n", median2);
    assert(median2 == 2.5);
    return 0;
}
 double findMedianSortedArrays(vector<int> nums1, vector<int> nums2, int m, int n, int k) {
     if (m > n) return findMedianSortedArrays(nums2, nums1, nums2.size(), nums1.size(), k);
     if (m == 0) return nums2[k-1];
     if (k == 1) return min(nums1[0], nums2[0]);
     int p1 = min((int)nums1.size(), k/2);
     int p2 = k - p1;
     if (nums1[p1 - 1] < nums2[p2 - 1]) {
         return findMedianSortedArrays(vector<int>(nums1.begin() + p1, nums1.end()), nums2, m - p1, n, k - p1);
     } else if (nums1[p1 - 1] > nums2[p2 - 1]) {
         return findMedianSortedArrays(nums1, vector<int>(nums2.begin() + p2, nums2.end()), m, n - p2, k - p2);
     } else {
         return nums1[p1-1];
     }
     
 }
 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     int n = nums1.size(), m = nums2.size();
     if(n > m) {
         return findMedianSortedArrays(nums2, nums1);
     }
     
     int left = 0, right = n;
     while(left <= right){
         int i = (left + right)>>1;
         int j = (n + m + 1)/2 - i;
         
         int l1 = i > 0 ? nums1[i - 1] : INT_MIN;
         int r1 = i < n ? nums1[i] : INT_MAX;
         int l2 = j > 0 ? nums2[j - 1] : INT_MIN;
         int r2 = j < m ? nums2[j] : INT_MAX;
         
         if(l1 > r2) {
             right = i - 1;
         } else if(r1 < l2) {
             left = i + 1;
         } else {
             return (n + m)%2 == 0 ? (double)(max(l1, l2) + min(r1, r2))/2.0 : max(l1, l2);
         }
     }
     return 0;
 }
예제 #7
0
파일: main.cpp 프로젝트: chrzhang/abc
int main() {
    // Use a merge style algorithm by walking through two pointers from
    // beginning to end of each vector in sorted order and stopping once
    // half of the total size has been traversed
    for (int totalSize = 1; totalSize < 100; ++totalSize) {
        std::vector<int> v;
        for (int i = 0; i < totalSize; ++i) {
            v.push_back(rand() % 100);
        }
        std::sort(v.begin(), v.end());
        double trueMedian = middleOf(v);
        std::vector<int> v1, v2;
        for (auto x : v) {
            if (rand() % 2) {
                v1.push_back(x);
            } else {
                v2.push_back(x);
            }
        }
        std::sort(v1.begin(), v1.end());
        std::sort(v2.begin(), v2.end());
        assert(findMedianSortedArrays(v1, v2) == trueMedian);
    }
    return 0;
}
예제 #8
0
 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     int m = nums1.size(), n = nums2.size();
     if(m > n)
         return findMedianSortedArrays(nums2, nums1);
     int i, j, low = 0, high = m, mid1, mid2, a, b;
     while(low <= high) {
         i = low + (high - low) / 2;
         j= (m + n + 1) / 2 - i;
         if(j > 0 && i < m && nums2[j - 1] > nums1[i])
             low = i + 1;
         else if(i > 0 && j < n && nums1[i - 1] > nums2[j])
             high = i - 1;
         else
             break;
     }
     a = i == 0 ? INT_MIN : nums1[i - 1];
     b = j == 0 ? INT_MIN : nums2[j - 1];
     mid1 = max(a, b);
     if((m + n) & 1)
         return mid1;
     a = i == m ? INT_MAX : nums1[i];
     b = j == n ? INT_MAX : nums2[j];
     mid2 = min(a, b);
     return (mid1 + mid2) / 2.0;
 }
예제 #9
0
int main() {
	srand(time(NULL));

    int n = 0, m = 4;
    int a[n], b[m];
    genArray(a, n);
    genArray(b, m);
    sort(a, a+n);
    sort(b, b+m);
    printArray(a, n);
    printArray(b, m);


    int c[n+m];
    int p = 0, p1 = 0, p2 = 0;
    while(p1 < n || p2 < m){
        if(p1 >= n || (p2 < m && b[p2] < a[p1]))
            c[p++] = b[p2++];
        else
            c[p++] = a[p1++];
    }
    printArray(c, n+m);
//    cout<<c[n]<<endl;

    cout<<findMedianSortedArrays(a, n, b, m)<<endl;



    return 0;
}
예제 #10
0
파일: 4.cpp 프로젝트: Neoustc/Interview
//O(log (min(m,n)))
//http://blog.csdn.net/u010738052/article/details/50450153
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    int m = nums1.size(), n = nums2.size();
    if (m > n) return findMedianSortedArrays(nums2, nums1);
    int imin = 0, imax = m;
    int i = 0, num1, num2;
    while (imin <= imax)
    {
        int i = (imin + imax) / 2;
        int j =((m + n + 1) >> 1) - i;

        if (j > 0 && i < m && nums2[j - 1] > nums1[i])
            imin = i + 1;
        else if (i > 0 && j < n && nums1[i - 1] > nums2[j])
            imax = i - 1;
        else {
            if (i == 0)
                num1 = nums2[j - 1];
            else if (j == 0)
                num1 = nums1[i - 1];
            else num1 = max(nums1[i - 1], nums2[j - 1]);

            if ((m + n) % 2 == 1)
                return num1;
            if (i == m)
                num2 = nums2[j];
            else if (j == n)
                num2 = nums1[i];
            else
                num2 = min(nums1[i], nums2[j]);
            return (num1 + num2) / 2.0;
        }
    }
}
예제 #11
0
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(m==0&&n!=0)
            return mid(B, n);
        if(n==0&&m!=0)
            return mid(A, m);
		if(m==1&&n==1)
			return ((double)A[0] + (double)B[0])/2;
        int midA = mid(A, m);
        int midB = mid(B, n);
        int* bigger;
        int* smaller; 
        int big, small;
        if(midA>midB)
        {
            bigger = A;
            big = m;
            smaller = B;
            small = n;
        }
        else
        {
            bigger = B;
            big = n;
            smaller = A;
            small = m;
        }
        
        int bigarr[1000], smallarr[1000];
        cutleft(bigger, big, bigarr);
        cutright(smaller, small, smallarr);
        return findMedianSortedArrays(bigarr, big/2, smallarr, small/2);	//DON'T MISS THE RETURN
        
    }
 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     if(nums1.empty() && nums2.empty())
     	return 0;
     if(nums1.size() > nums2.size())
     	return findMedianSortedArrays(nums2, nums1);
     int midIdx = (nums1.size() + nums2.size()) / 2;
 }
int main(void)
{
	int array1[] = {1, 2, 3, 7, 9, 10};
	int array2[] = {4, 5, 6, 8};
	
	double result;
	int i;

	result = findMedianSortedArrays(array1, ARRAY_SIZE(array1), array2, ARRAY_SIZE(array2));
	
	for(i = 0; i < ARRAY_SIZE(array1); i++)
	{
		printf("%d ", array1[i]);
	}
	printf("\n");

	for(i = 0; i < ARRAY_SIZE(array2); i++)
	{
		printf("%d ", array2[i]);
	}
	printf("\n");

	printf("result = %f\n", result);

	return 0;

}
예제 #14
0
void run4() {
    int nums1Size = arc4random()%20;
    int nums2Size = arc4random()%20;
    int * nums1 = sortedArray(nums1Size);
    int * nums2 = sortedArray(nums2Size);
    double result = findMedianSortedArrays(nums1, nums1Size, nums2, nums2Size);
    printf("median_of_two_sorted_arrays_test %lf", result);
}
예제 #15
0
double findMedianSortedArrays(int A[], int m, int B[], int n) {
    if(m<=0) return mid(B,n);
    if(n<=0) return mid(A,m);
    if(m>n) return findMedianSortedArrays(B,n,A,m);
    if(m==1)
    {
        return mid2(A[0],B,n);
    }
    if(A[0]<=B[0] && A[m-1]>=B[n-1])
        return findMedianSortedArrays(&A[1],m-2,B,n);
    else if (B[0]<=A[0] && B[n-1]>=A[m-1])
        return findMedianSortedArrays(A,m, &B[1],n-2);

    double aMid = mid(A,m);
    double bMid = mid(B,n);
    if(aMid==bMid) 
        return aMid;
        
    else if(aMid<bMid)
    {
        if((m&1)==0 && m!=2)
            return findMedianSortedArrays(&A[m/2-1],m-(m/2-1), B, n-(m/2-1));
        else
            return findMedianSortedArrays(&A[m/2],m-m/2, B, n-m/2);
    }
    else
    {
        if(m!=2)
            return findMedianSortedArrays(A,m/2+1, &B[m-(m/2+1)] ,n-(m-(m/2+1)));
        else
            return findMedianSortedArrays(A,1, &B[1] ,n-1);
    }
}
int main(int argc, char* argv)
{
	int nums1[] = {1, 2};
	int nums2[] = {3, 4};

	int* res = findMedianSortedArrays(nums1, 2, nums1, 2);
	printf("%d %d\n", res);
	return 0;
}
void MedianOfTwoSortedArrays::TestClass()
{
	int Array1[1]={};
	int Array2[2]={2,3};
	vector<int> nums1(Array1,Array1);
	vector<int> nums2(Array2,Array2+2);
	double res=findMedianSortedArrays(nums1,nums2);
	cout<<"median="<<res<<endl;
}
예제 #18
0
파일: work.c 프로젝트: uangyy/leetcode
int main(int argc, char **argv)
{
    int arr1[] = {1, 3, 4, 5, 6, 7, 8},
        arr2[] = {2, 3, 4, 5, 7};
    double res;
    res = findMedianSortedArrays(arr1, 7, arr2, 5);
    printf("%f\n", res);
    return 0;
}
예제 #19
0
파일: median.c 프로젝트: Sasasu/leetcode
int main(int argc, char *argv[])
{
	int n1[] = {};
	int n2[] = {1};
	printf("%.2f\n", findMedianSortedArrays(n1, sizeof(n1) / 4, n2, sizeof(n2) / 4));
	
	int n3[] = {};
	int n4[] = {2, 3};
	printf("%.2f\n", findMedianSortedArrays(n3, sizeof(n3) / 4, n4, sizeof(n4) / 4));

	int n7[] = {1};
	int n8[] = {1};
	printf("%.2f\n", findMedianSortedArrays(n7, sizeof(n7) / 4, n8, sizeof(n8) / 4));	

	int n5[] = {1, 2};
	int n6[] = {1, 2};
	printf("%.2f\n", findMedianSortedArrays(n5, sizeof(n5) / 4, n6, sizeof(n6) / 4));
}
예제 #20
0
int main(int argc, char **argv)
{
    int nums1[] = {1,2,3,4,5,6,7,8,9,10};
    int nums2[] = {2,4,6,8,10};
    double median = findMedianSortedArrays(nums1, 10, nums2, 5);

    printf("%lf\n", median);

    return 0;
}
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        if (m>n){
            return findMedianSortedArrays(B, n, A, m);
        }
        if (m < 2){
            if (m == 0) return (B[(n-1)/2] + B[n/2])/2.0;
            if (m == 1){
                if (n & 1){
                    if (n == 1){
                        return (A[0] + B[0]) / 2.0;
                    }
                    int x = B[n/2-1], y = B[n/2+1], z = B[n/2];
                    if (A[0] < x) return (x + z)/2.0;
                    if (A[0] < y) return (A[0] + z)/2.0;
                    return (z + y)/2.0;
                }else{
                    int x = B[(n-1)/2], y = B[n/2];
                    if (A[0] < x) return x;
                    if (A[0] > y) return y;
                    return A[0];
                }
            }
        }

        int xa = 0, ya = 0, xb = 0, yb = 0;
        if(A[(m-1)/2] < B[(n-1)/2]){
            xa = m/2;
        }else{
            xb = n/2;
        }
        if (A[m/2] > B[n/2]){
            ya = m/2;
        }else{
            yb = n/2;
        }
        if (xa != ya){
            xa = min(xa, yb);
            xb = min(xb, ya);
            ya = min(ya, xb);
            yb = min(yb, xa);
        }
        return findMedianSortedArrays(A+xa,m-xa-ya, B+xb, n-xb-yb);
    }
    /*int min(int a,int b)
    {
        return (a<b?a:b);
    }
    int max(int a,int b)
    {
        return (a>=b?a:b);
    }*/
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
    {
        if (nums1.size()>nums2.size())
        {
            return findMedianSortedArrays(nums2, nums1);
        }
        int imin,imax,i,j,m,n,mid;
        m=nums1.size();
        n=nums2.size();
        imin=0;
        imax=m;
        mid=(m+n)/2;
        while(imin<=imax)
        {
            i=(imin+imax)/2;
            j=mid-i;
            if(j>0&&i<m&&nums2[j-1]>nums1[i])
            {
                imin=i+1;
            }
            else if (i>0&&j<n&&nums1[i-1]>nums2[j])
            {
                imax=i-1;
            }
            else 
            {
                int min_of_right,max_of_left;
                /*
                if (i == 0) max_of_left = nums2[j-1];
                else if (j == 0) max_of_left = nums1[i - 1];
                else max_of_left = max(nums1[i-1],nums2[j-1]);
                
                if ((m+n)%2==1) return max_of_left;
                
                if (i==m) min_of_right=nums2[j];
                else if(j==n) min_of_right=nums1[i];
                else min_of_right=min(nums1[i],nums2[j]);
                */
                if (i==m) min_of_right=nums2[j];
                else if(j==n) min_of_right=nums1[i];
                else min_of_right=min(nums1[i],nums2[j]);
                
                if ((m+n)%2==1) return min_of_right;
                
                if (i == 0) max_of_left = nums2[j-1];
                else if (j == 0) max_of_left = nums1[i - 1];
                else max_of_left = max(nums1[i-1],nums2[j-1]);

                
                return (max_of_left + min_of_right) / 2.0;
            }
        }
        
        
    }
예제 #23
0
int main()
{
	int a[]={1,3,5};
	int b[]={2,4,6};
	int aLen=sizeof(a)/sizeof(a[0]);
	int bLen=sizeof(b)/sizeof(b[0]);
	printf("aLen:%d,bLen:%d\n",aLen,bLen);
	printf("result of medium %lf\n",findMedianSortedArrays(a,aLen,b,bLen));

	return 0;
}
예제 #24
0
int main( int argc, char *argv[] ) {
	int size1, size2, *arr1, *arr2;
	fscanf( stdin, "%d", &size1 );
	arr1 = (int *)malloc( sizeof( int ) * size1 );
	for ( int i=0; i<size1; i++ ) fscanf( stdin, "%d", &arr1[i] );
	fscanf( stdin, "%d", &size2 );
	arr2 = (int *)malloc( sizeof( int ) * size2 );
	for ( int i=0; i<size2; i++ ) fscanf( stdin, "%d", &arr2[i] );
	double answer = findMedianSortedArrays( arr1, size1, arr2, size2 );
	fprintf( stderr ,"%lf\n", answer );
	return 0;
}
예제 #25
0
int main()
{
	double i;
	int a[2]={1,1};
	int b[1]={3};

	i = findMedianSortedArrays(a,2,b,1);

	printf("median = %f\n",i);

	return 0;
}
예제 #26
0
int main(){
    int nums1[] = {0,4,4,5};
    int nums2[] = {1,4,5,6,8,9};

    size_t m = sizeof(nums1)/sizeof(int);
    size_t n = sizeof(nums2)/sizeof(int);

    double res = findMedianSortedArrays(nums1, m, nums2, n);

    printf("Result is = %f\n", res);

    return 0;
}
int main()
{
	int A[10], B[10];
	double res;
	for(int i=0; i<10; i++)
	{
		A[i] = i+1;
		B[i] = i;
	}
	res = findMedianSortedArrays(A, 10, B, 0);
	printf("res = %f\n", res);
	return 0;
}
        void Main()
        {
			print(findMedianSortedArrays(createVector({ 1, 2 }), createVector({ 1, 2, 3 })));
			print(findMedianSortedArrays(createVector({ 1, 2, 3 }), createVector({ 4, 5, 6 })));
			print(findMedianSortedArrays(createVector({ 2 }), vector<int>()));
			print(findMedianSortedArrays(createVector({ 1, 1 }), createVector({ 1, 2 })));
			
			print(findMedianSortedArrays(createVector({ 1, 2 }), createVector({ 1, 2 })));
			print(findMedianSortedArrays(createVector({ 1, 1 }),createVector({ 1, 1 })));
			print(findMedianSortedArrays(vector<int>(), createVector({ 2, 3 })));
        }
 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     int N1 = nums1.size();
     int N2 = nums2.size();
     if (N1 < N2) return findMedianSortedArrays(nums2, nums1);	// Make sure A2 is the shorter one.
     
     if (N2 == 0) return ((double)nums1[(N1-1)/2] + (double)nums1[N1/2])/2;  // If A2 is empty
     
     int lo = 0, hi = N2 * 2;
     while (lo <= hi) {
         int mid2 = (lo + hi) / 2;   // Try Cut 2 
         int mid1 = N1 + N2 - mid2;  // Calculate Cut 1 accordingly
         
         double L1 = (mid1 == 0) ? INT_MIN : nums1[(mid1-1)/2];	// Get L1, R1, L2, R2 respectively
         double L2 = (mid2 == 0) ? INT_MIN : nums2[(mid2-1)/2];
         double R1 = (mid1 == N1 * 2) ? INT_MAX : nums1[(mid1)/2];
         double R2 = (mid2 == N2 * 2) ? INT_MAX : nums2[(mid2)/2];
         
         if (L1 > R2) lo = mid2 + 1;		// A1's lower half is too big; need to move C1 left (C2 right)
         else if (L2 > R1) hi = mid2 - 1;	// A2's lower half too big; need to move C2 left.
         else return (max(L1,L2) + min(R1, R2)) / 2;	// Otherwise, that's the right cut.
     }
     return -1;
 }
int main()
{
    int r1[] = {1};
    int r2[] = {2};
 
    int n1 = sizeof(r1)/sizeof(r1[0]);
    int n2 = sizeof(r2)/sizeof(r2[0]);

    printf("Median is 1.5 = %f\n", findMedianSortedArrays(r1, n1, r2, n2));

    int ar1[] = {1, 12, 15, 26, 38};
    int ar2[] = {2, 13, 17, 30, 45, 50};
 
    n1 = sizeof(ar1)/sizeof(ar1[0]);
    n2 = sizeof(ar2)/sizeof(ar2[0]);

    printf("Median is 17 = %f\n", findMedianSortedArrays(ar1, n1, ar2, n2));

    int ar11[] = {1, 12, 15, 26, 38};
    int ar21[] = {2, 13, 17, 30, 45 };
 
    n1 = sizeof(ar11)/sizeof(ar11[0]);
    n2 = sizeof(ar21)/sizeof(ar21[0]);

    printf("Median is 16 = %f\n", findMedianSortedArrays(ar11, n1, ar21, n2));

    int a1[] = {1, 2, 5, 6, 8 };
    int a2[] = {13, 17, 30, 45, 50};
 
    n1 = sizeof(a1)/sizeof(a1[0]);
    n2 = sizeof(a2)/sizeof(a2[0]);

    printf("Median is 10.5 = %f\n", findMedianSortedArrays(a1, n1, a2, n2));

    int a10[] = {1, 2, 5, 6, 8, 9, 10 };
    int a20[] = {13, 17, 30, 45, 50};
 
    n1 = sizeof(a10)/sizeof(a10[0]);
    n2 = sizeof(a20)/sizeof(a20[0]);

    printf("Median is 9.5 = %f\n", findMedianSortedArrays(a10, n1, a20, n2));

    int a11[] = {1, 2, 5, 6, 8, 9 };
    int a21[] = {13, 17, 30, 45, 50};
 
    n1 = sizeof(a11)/sizeof(a11[0]);
    n2 = sizeof(a21)/sizeof(a21[0]);

    printf("Median is 9 = %f\n", findMedianSortedArrays(a11, n1, a21, n2));

    int a12[] = {1, 2, 5, 6, 8 };
    int a22[] = {11, 13, 17, 30, 45, 50};
 
    n1 = sizeof(a12)/sizeof(a12[0]);
    n2 = sizeof(a22)/sizeof(a22[0]);

    printf("Median is 11 = %f\n", findMedianSortedArrays(a12, n1, a22, n2));

    int b1[] = {1 };
    int b2[] = {2,3,4};
 
    n1 = sizeof(b1)/sizeof(b1[0]);
    n2 = sizeof(b2)/sizeof(b2[0]);

    printf("Median is 2.5 = %f\n", findMedianSortedArrays(b1, n1, b2, n2));
    return 0;
}