码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 4 Median of Two Sorted Arrays

时间:2015-05-06 13:23:40      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:leetcode   c   c++   java   python   

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

C++源代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& 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<int> a,vector<int> 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<b else b



LeetCode 4 Median of Two Sorted Arrays

标签:leetcode   c   c++   java   python   

原文地址:http://blog.csdn.net/runningtortoises/article/details/45533355

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!