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