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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值