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编辑  收藏  举报

导航