LeetCode-4 Median of Two Sorted Arrays
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)).
思路:
如果已知求两个排好序的数组中第K大的数,那么问题就变成求两个拍好序的数组中第(m+n)/2大的数了,当然需要考虑奇偶数。
一下分别给出求两个数组第K大数的递归和非递归实现。
递归解法:
1 //s1表示nums1数组的起始下标,s2表示nums2数组的起始下标 2 public int getKthNumRecursion(int[] nums1, int s1, int[] nums2, int s2, int k) { 3 if(nums1.length-s1 > nums2.length-s2) //保证s1数组的剩余长度小于等于s2数组的剩余长度,这样可以防止之后求index1,index2的时候溢出 4 return getKthNumRecursion(nums2, s2, nums1, s1, k); 5 if(s1>=nums1.length) 6 return nums2[s2+k-1]; 7 if(k == 1) 8 return Math.min(nums1[s1], nums2[s2]); 9 int index1 = Math.min(k/2-1+s1, nums1.length-1); 10 int index2 = k-(index1-s1+1)-1+s2; 11 if(nums1[index1] < nums2[index2]) { 12 return getKthNumRecursion(nums1, index1+1, nums2, s2, k-(index1-s1+1)); 13 } else if(nums1[index1] > nums2[index2]) { 14 return getKthNumRecursion(nums1, s1, nums2, index2+1, k-(index2-s2+1)); 15 } else { 16 return nums1[index1]; 17 } 18 }
非递归解法:
1 public int getKthNum(int[] nums1, int[] nums2, int k) { 2 if(nums1.length == 0) return nums2[k-1]; 3 if(nums2.length == 0) return nums1[k-1]; 4 5 int s1 = 0, s2 = 0; 6 while(s1<nums1.length && s2<nums2.length && k != 1) { 7 int index1, index2; 8 if(nums1.length - s1 > nums2.length - s2) { 9 index2 = Math.min(k/2-1+s2, nums2.length-1); 10 index1 = s1+(k-(index2-s2+1))-1; 11 } else { 12 index1 = Math.min(k/2-1+s1, nums1.length-1); 13 index2 = s2+(k-(index1-s1+1))-1; 14 } 15 16 if(nums1[index1] < nums2[index2]) { 17 k = k - (index1-s1+1); 18 s1 = index1+1; 19 } else if(nums1[index1] > nums2[index2]) { 20 k = k - (index2-s2+1); 21 s2 = index2+1; 22 } else { 23 return nums1[index1]; 24 } 25 } 26 if(s1 >= nums1.length) return nums2[k-1]; 27 else if(s2 >= nums2.length) return nums1[k-1]; 28 else return Math.min(nums1[s1], nums2[s2]); 29 }
有了以上方法之后,求两个数组中位数的方法为:
1 public double findMedianSortedArrays(int[] nums1, int[] nums2) { 2 int m = nums1.length, n = nums2.length; 3 if((m+n) % 2 == 1) 4 return getKthNumRecursion(nums1, 0, nums2,0, (m+n)/2 +1); 5 else 6 return ((double)getKthNumRecursion(nums1, 0, nums2, 0, (m+n)/2) + getKthNumRecursion(nums1, 0, nums2, 0, (m+n)/2+1))/2; 7 }
posted on 2015-05-19 17:34 linxiong1991 阅读(342) 评论(0) 编辑 收藏 举报