leetcode-4-Median of Two Sorted Arrays

题目: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)).

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

 

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

思路:见我的另一篇博客:寻找第K小数
代码如下;
 1 class Solution {
 2     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
 3         if((nums1.length+nums2.length)%2==1){
 4             int k=findKthNum(nums1,nums2,(nums1.length+nums2.length+1)/2);
 5             double r=k/1.0;
 6             return r;
 7         }else{
 8             int a=findKthNum(nums1,nums2,(nums1.length+nums2.length+1)/2);
 9             int b=findKthNum(nums1,nums2,(nums1.length+nums2.length+1)/2+1);
10             double r=(a+b)/2.0;
11                 return r;
12         }
13       
14     }
15     public  int getUpMedian(int[] arr1,int start1,int end1,int[] arr2,int start2,int end2){
16         int mid1=0,mid2=0;
17         int offset=0;//用于判断过程中数组的长度的奇偶
18         while(start1<end1){
19             mid1=(start1+end1)/2;
20             mid2=(start2+end2)/2;
21             offset=((end1-start1+1)&1)^1;
22             //元素个数为奇数,offset为0,元素个数为偶数,offset为1
23             if (arr1[mid1] > arr2[mid2]){
24                  end1=mid1;
25                  start2=mid2+offset;
26             }else if(arr1[mid1]<arr2[mid2]){
27                 end2=mid2;
28                 start1=mid1+offset;
29             }else{
30                 return arr1[mid1];
31             }
32         }
33         return Math.min(arr1[start1],arr2[start2]);
34     }
35     public  int findKthNum(int[]arr1,int[]arr2,int kth){
36         if(arr1.length==0)return arr2[kth-1];
37         if(arr2.length==0)return arr1[kth-1];
38         if(kth<1||kth>arr1.length+arr2.length){
39             throw new RuntimeException("k is invalid");
40         }
41         int[]longs=arr1.length>=arr2.length?arr1:arr2;
42         int[]shorts=arr1.length<arr2.length?arr1:arr2;
43         int l=longs.length;
44         int s=shorts.length;
45         if(kth<=s){
46             return getUpMedian(shorts,0,kth-1,longs,0,kth-1);
47         }
48         if(kth>l){
49             if(shorts[kth-l-1]>=longs[l-1])
50                 return shorts[kth-l-1];
51             if(longs[kth-s-1]>=shorts[s-1])
52                 return longs[kth-s-1];
53             return getUpMedian(shorts,kth-l,s-1,longs,kth-s,l-1);
54         }
55        else if(longs[kth-s-1]>=shorts[s-1]){
56             return longs[kth-s-1];
57         }
58         return getUpMedian(shorts,0,s-1,longs,kth-s,kth-1);
59     }
60 }

Your runtime beats 18.77 % of java submissions

不知道为何还是比较慢,看了排第一的算法,感觉差别不大

 1 class Solution {
 2     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
 3         int len1 = nums1.length;
 4         int len2 = nums2.length;
 5         if((len1+len2)%2==0){
 6             return (double)(findKnum(nums1,nums2, 0,0,len1,len2,(len1+len2)/2)+findKnum(nums1,nums2, 0,0,len1,len2,(len1+len2)/2+1))/2;
 7         }else{
 8             return findKnum(nums1,nums2, 0,0,len1,len2,(len1+len2)/2+1);
 9         }
10     }
11     
12     public int findKnum(int[] num1, int[] num2, int start, int start2, int len1, int len2, int k){
13         if(len1>len2){
14             return findKnum(num2,num1, start2,start,len2,len1,k);
15         }
16         if(len1 == 0)
17             return num2[start2+k-1];
18         if(k==1)
19             return Math.min(num1[start], num2[start2]);
20         int pa = Math.min(len1, k/2);
21         int pb = k - pa;
22         if(num1[start+pa-1]<num2[start2+pb-1]){
23             return findKnum(num1,num2,start+pa,start2,len1-pa,len2,k-pa);
24         }else if(num1[start+pa-1]>num2[start2+pb-1]){
25             return findKnum(num1, num2, start, start2+pb,len1, len2-pb, k-pb);
26         }else{
27             return num1[start+pa-1];
28         }
29         
30     }
31 }

 

posted @ 2018-05-27 22:28  pathjh  阅读(146)  评论(0编辑  收藏  举报