LeetCode 4 Median of Two Sorted Arrays

Problem:

There are two sorted arrays  nums1  and  nums2  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)).

Solution:

使用查找第K大数的方法,时间复杂度为O(log(m+n))

题目大意:

给定两个有序数组(目测应该都是升序排列),然后找到两个数组合并之后的中数(中数就是使得小于中数的和大于中数的数目都一样的数,如果数组为偶数个数,为中间两个数的平均数,否则为中间那个数)

解题思路:

可以通过查找 (m+n+1)/2或者查找 (m+n+1)/2和 (m+n+1)/2+1得到,时间复杂度为O(log(m+n))。也可以通过合并数组之后排序得到,最优复杂度为O((m+n)log(m+n))

Java源代码:

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if((nums1.length+nums2.length)%2==1){
            return findKth(nums1,nums2,(nums1.length+nums2.length+1)/2);
        }else{
            return (1.0*findKth(nums1,nums2,(nums1.length+nums2.length+1)/2)+findKth(nums1,nums2,(nums1.length+nums2.length+1)/2+1))/2;
        }
    }
    public int findKth(int[] a,int[] b,int k){
        int len1=a.length,len2=b.length;
        if(len1==0)return b[k-1];
        if(len2==0)return a[k-1];
        if(k==1)return min(a[0],b[0]);
        int mid1=min(k/2,len1),mid2=min(k/2,len2);
        if(a[mid1-1] < b[mid2-1]){
            int[] c = new int[len1-mid1];
            for(int i=0;ib?b:a;
    }
}

C语言源代码:

int min(int a,int b){
	return a>b?b:a;
}
int findKth(int *a,int len1,int* b,int len2,int k){
    int mid1,mid2;
    if(len1==0)return b[k-1];
    if(len2==0)return a[k-1];
	if(k==1){
		return a[0]

C++源代码:

class Solution {
public:
    double findMedianSortedArrays(vector& nums1, vector& nums2) {
        int size1=nums1.size(),size2=nums2.size();
        if((size1+size2)%2){
            return findKth(nums1,nums2,(size1+size2+1)/2);
        }else{
            return (1.0*findKth(nums1,nums2,(size1+size2+1)/2)+findKth(nums1,nums2,(size1+size2+1)/2+1))/2;
        }
    }
private:
    int findKth(vector a,vector b,int k){
        int len1=a.size();
        int len2=b.size();
        if(len1==0)return b[k-1];
        if(len2==0)return a[k-1];
        if(k==1)return min(a[0],b[0]);
        int mid1 = min(k/2,len1);
        int mid2 = min(k/2,len2);
        if(a[mid1-1] < b[mid2-1]){
            a.erase(a.begin(),a.begin()+mid1);
            return findKth(a,b,k-mid1);
        }else{
            b.erase(b.begin(),b.begin()+mid2);
            return findKth(a,b,k-mid2);
        }
    }
    int min(int a,int b){
        return a>b?b:a;
    }
};

Python源代码:

class Solution:
    def findKth(self,a,b,k):
        len1=len(a)
        len2=len(b)
        if len1==0:return b[k-1]
        if len2==0:return a[k-1]
        if k==1:return min(a[0],b[0])
        mid1=min(k/2,len1)
        mid2=min(k/2,len2)
        if a[mid1-1] < b[mid2-1]:
            c=a[mid1:len1]
            return self.findKth(c,b,k-mid1)
        else:
            c=b[mid2:len2]
            return self.findKth(a,c,k-mid2)
    # @param {integer[]} nums1
    # @param {integer[]} nums2
    # @return {float}
    def findMedianSortedArrays(self, nums1, nums2):
        len1=len(nums1)
        len2=len(nums2)
        if (len1+len2)%2 == 1:
            return self.findKth(nums1,nums2,(len1+len2+1)/2)
        else:
            return (self.findKth(nums1,nums2,(len1+len2+1)/2)+self.findKth(nums1,nums2,(len1+len2+1)/2+1))/2.0
    def min(self,a,b):
        return a if a



你可能感兴趣的:(LeetCode)