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; } }
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; } }
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; } };
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
原文地址:http://blog.csdn.net/runningtortoises/article/details/45533355