F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[Leetcode] Median of Two Sorted Arrays

这个问题是求第K大的一个中特殊情况。

假设连个数组是A,B,我们分别求A和B的前m段和前n段,且m+n=k。

我们比较A[m-1] 和 B[n-1]

如果A[m-1] < B[n-1]则舍弃A的前m个元素,且现在需要找的是第k-m大的元素

相反,舍弃B的前n个元素,且现在需要找的是第k-n大的元素

 

关键是为什么呢?我们舍弃的部分可能是不包括第k大的,如果包括第k大,那么舍弃的部分小于等于第k大的元素加上另一个数组当中小于等于第k大的元素,元素个数之和一定是小于k的,这样是矛盾的,所以第k大一定不再被舍弃的部分当中。

 1 public class Solution {
 2     private int findkth(int []nums1, int start1, int s1, int [] nums2, int start2, int s2, int k){
 3         if(s1>s2) return findkth(nums2,start2,s2,nums1,start1,s1,k);
 4         if(s1==0) return nums2[start2+k-1];
 5         if(k==1) return Math.min(nums1[start1],nums2[start2]);
 6         int pa=Math.min(s1,k/2);
 7         int pb=k-pa;
 8         if(nums1[start1+pa-1]<nums2[start2+pb-1]){
 9             return findkth(nums1,start1+pa,s1-pa,nums2,start2,s2,k-pa);
10         }
11         else{
12             return findkth(nums1,start1,s1,nums2,start2+pb,s2-pb,k-pb);
13         }
14     }
15     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
16         int m=nums1.length;
17         int n=nums2.length;
18         int mn=m+n;
19         if(mn%2==1){
20             //we should pay attention to the last parameter, it means the rank, other than the index, so it starts from 1 not 0.
21             int res=findkth(nums1,0,m,nums2,0,n,mn/2+1);
22             return (double)res;
23         }
24         else{
25             int res1=findkth(nums1,0,m,nums2,0,n,mn/2);
26             int res2=findkth(nums1,0,m,nums2,0,n,mn/2+1);
27             return ((double)res1+(double)res2)/2;
28         }
29     }
30 }

 

posted on 2015-08-12 21:56  F_G  阅读(236)  评论(0编辑  收藏  举报