题目链接4.求两个正序数组的中位数难度:hard有点类似TopK问题,只不过它是有序的,是Searchinthe两个数组,只需找到两点的中位数。解1.归并排序暴力解,略过2.除中位数对两个数组进行切割,假设A数组的长度为m,切割位置为i,B数组的长度为n,切割位置为j,则有:左半部分的长度等于右半部分的长度,即:i+j=m-i+n-j,即j=(m+n)/2-i(当数组A和数组B的总长度为奇数时,j=(m+n+1)/2-i)由于四舍五入,所以j=(m+n)/2-i且j=(m+n+1)/2-i此时结果是一致的,只要max(A[i-1],B[j-1]))<=min(A[i],B[j]))求得,中位复杂度分析时间复杂度为:O(min(m,n)),其中m,n为两个数组的长度。我们将长度较短的数组一分为二。空间复杂度:O(1)。以下为PHP语言实现~~~~classSolution{/***@paramInteger[]$nums1*@paramInteger[]$nums2*@returnFloat*/functionfindMedianSortedArrays($nums1,$nums2){$a=$nums1;$b=$nums2;$m=计数($a);$n=计数($b);如果($m>$n){返回$this->findMedianSortedArrays($nums2,$nums1);$mid=(int)(($m+$n+1)/2);$i_min=0;$i_max=$m;$计数=0;while($i_min<=$i_max){$i=(int)(($i_min+$i_max)/2);$j=$mid-$i;如果($i<$i_max&&$b[$j-1]>$a[$i]){$i_min=$i+1;}elseif($i>$i_min&&$a[$i-1]>$b[$j]){$i_max=$i-1;}else{if($i==0){$max_left=$b[$j-1];}elseif($j==0){$max_left=$a[$i-1];}别的{$max_left=$a[$i-1]>$b[$j-1]?$a[$i-1]:$b[$j-1];}if(($m+$n)%2==1){返回$max_left;}if($i==$m){$min_right=$b[$j];}elseif($j==$n){$min_right=$a[$i];}else{$min_right=$a[$i]<$b[$j]?$a[$i]:$b[$j];}$res=($max_left+$min_right)/2;返回$res;}}}}
