zoukankan      html  css  js  c++  java
  • leetcode--Median of Two Sorted Arrays

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    method 1, time complexity = O(max{m,n})

    public class Solution {
        public double findMedianSortedArrays(int A[], int B[]) {
            double result = 0;
    		if(A.length != 0 || B.length != 0){
    			if(A.length == 0)
    				result = (B[(B.length - 1)/2] + B[B.length/2]) / 2.0;
    			if(B.length == 0)
    				result = (A[(A.length - 1)/2] + A[A.length/2]) / 2.0;
    			int length = A.length + B.length;
    			int[] total = new int[length];			
    			int index1 = 0;
    			int index2 = 0;
    			for(int i = 0; i < length / 2 + 1; ++ i){
    				if(index1 < A.length && index2 < B.length){
    					if(A[index1] <= B[index2]){
    						total[i] = A[index1];
    						++index1;
    					}
    					else{
    						total[i] = B[index2];
    						++index2;
    					}
    				}
    				else if(index1 == A.length){
    					total[i] = B[index2];
    					++index2;
    				}
    				else{
    					total[i] = A[index1];
    					++index1;
    				}
    			}
    			result = (total[(length - 1)/2] + total[length /2]) / 2.0;
    		}
    		return result;
        }
    }
    

      

    The O(log(m + n)) method

    public class Solution {
        public double findMedianSortedArrays(int A[], int B[]) {
           int alen = A.length, blen = B.length;
           if((alen + blen) % 2 != 0) //odd number of elements in total
        	   return findHelper(A, B, (alen + blen) / 2 + 1, 0, alen - 1, 0, blen - 1);
           else //even number of elements in total
        	   return (findHelper(A, B, (alen + blen) / 2, 0, alen - 1, 0, blen - 1) 
        			 + findHelper(A, B, (alen + blen) / 2 + 1, 0, alen - 1, 0, blen - 1)) / 2.0;
        }
    	private int findHelper(int A[], int B[], int k, int startA, int endA, int startB, int endB){
    		if(endA < startA)
    			return B[startB + k - 1];
    		if(endB < startB)
    			return A[startA + k - 1];
    		if(k == 1)
    			return Math.min(A[startA], B[startB]);
    		
    		int lenA = endA - startA + 1;
    		int lenB = endB - startB + 1;
    		
    		if(lenA > lenB)
    			return findHelper(B, A, k, startB, endB, startA, endA);
    		else {
    			int aMid = Math.min(k / 2, lenA);
    			int bMid = k - aMid;
    			if(A[startA + aMid - 1] < B[startB + bMid - 1])
    				return findHelper(A, B, k - aMid, startA + aMid, endA, startB, endB);
    			else if(A[startA + aMid - 1] > B[startB + bMid - 1])
    				return findHelper(A, B, k - bMid, startA, endA, startB + bMid, endB);
    			else //A[startA + aMid - 1] == B[startB + bMid - 1]
    				return A[startA + aMid - 1];
    		}
        }
    }
    

      

  • 相关阅读:
    cf1058c 暴力
    cf1058b 点是否在一个矩形里
    cf1058E 思维 前缀处理 位运算
    Codeforces Round #622 (Div. 2)C(单调栈,DP)
    Codeforces Round #623 (Div. 1, based on VK Cup 2019-2020
    Atcoder Beginner Contest 156E(隔板法,组合数学)
    【PAT甲级】1117 Eddington Number (25分)
    【PAT甲级】1116 Come on! Let's C (20分)
    【PAT甲级】1115 Counting Nodes in a BST (30分)(二叉查找树)
    Codeforces Round #621 (Div. 1 + Div. 2)E(二分查找,枚举分界点,容斥原理)
  • 原文地址:https://www.cnblogs.com/averillzheng/p/3540115.html
Copyright © 2011-2022 走看看