题目描述
自我尝试
首先,就是两个有序的数组进行遍历,遍历到一半即可。然后求出均值,下述是我的代码。但这明显是有问题的,具体错误的代码如下。计算复杂度太高了,O(n),所以会超时,具体代码如下 这说明一个问题,不能逐个遍历,只要遍历就一定有问题的,可以尝试一下对折寻找。
double findMedianSortedArrays ( vector< int > & nums1, vector< int > & nums2) {
double numsLeft = 0 , numsRight = 0 ;
int len = nums1. size ( ) + nums2. size ( ) , index = 0 ;
for ( int i = 0 , j = 0 ; i <= nums1. size ( ) && j <= nums2. size ( ) ; ) {
if ( nums1[ i] < nums2[ j] )
numsLeft = nums1[ i ++ ] ;
else
numsLeft = nums2[ j ++ ] ;
if ( index == len / 2 - 1 ) numsLeft = numsLeft;
if ( index == len / 2 ) numsRight = numsLeft;
index ++ ;
}
if ( len % 2 == 2 )
return ( numsLeft + numsRight ) / 2 ;
else
return numsRight;
}
正常做法
这里仅仅讲解二分法,只需要注意这里的k是在剩下的元素中,寻找第k小的数字即可
double findMedianSortedArrays ( vector< int > & nums1, vector< int > & nums2) {
int tot = nums1. size ( ) + nums2. size ( ) ;
if ( tot % 2 == 0 ) {
int left = find ( nums1, 0 , nums2, 0 , tot / 2 ) ;
int right = find ( nums1, 0 , nums2, 0 , tot / 2 + 1 ) ;
return ( left + right) / 2.0
} else {
return find ( nums1, 0 , nums2, 0 , tot / 2 + 1 ) ;
}
}
int find ( vector< int > nums1, int i, vector< int > nums2, int j, int k) {
if ( nums1. size ( ) - i > nums2. size ( ) - j) return find ( nums2, j, nums1, i, k) ;
if ( k == 1 ) {
if ( nums1. size ( ) == i) return nums2[ j] ;
else return min ( nums1[ i] , nums2[ j] ) ;
}
if ( nums1. size ( ) == i) return nums2[ j + k - 1 ] ;
int si = min ( ( int ) nums1. size ( ) , i + k / 2 ) , sj = j + k - k / 2 ;
if ( nums1[ si - 1 ] > nums2[ sj - 1 ] )
return find ( nums1, i, nums2, sj, k - ( sj - j) ) ;
else
return find ( nums1, si, nums2, j, k- ( si - i) ) ;
}
分析总结
还是适合中午或者下午做算法题,不然太难受了,一个上午都是晕乎乎的。