题目描述
自我尝试
首先,就是两个有序的数组进行遍历,遍历到一半即可。然后求出均值,下述是我的代码。但这明显是有问题的,具体错误的代码如下。计算复杂度太高了,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) ) ;
}
分析总结
还是适合中午或者下午做算法题,不然太难受了,一个上午都是晕乎乎的。