image.png

    1. <?php
    2. /**
    3. * [1, 2, 3, 5]
    4. * [4, 6, 7, 8, 9]
    5. * 5
    6. *
    7. * @param $nums1
    8. * @param $nums2
    9. * @return float|int|mixed
    10. */
    11. function findMedianSortedArrays($nums1, $nums2) {
    12. if (count($nums1) > count($nums2)) {
    13. return findMedianSortedArrays($nums2, $nums1);
    14. }
    15. if (count($nums1) == 0) {
    16. return floor($nums2[count($nums2) - 1] / 2 + $nums2[count($nums2) / 2]) / 2;
    17. }
    18. $len = count($nums1) + count($nums2);
    19. $cut1 = 0;
    20. $cutL = 0;
    21. $cutR = count($nums1);
    22. while ($cut1 <= count($nums1)) {
    23. // 二分法分割点,$cutL 和 $cutR 分别为上一次左右两边
    24. // $cut1 >= $cut1
    25. // $cut2 <= $cut2
    26. $cut1 = floor(($cutR - $cutL) / 2) + $cutL;
    27. $cut2 = floor($len / 2) - $cut1;
    28. // 分割点左边数
    29. $l1 = ($cut1 == 0) ? PHP_INT_MIN : $nums1[$cut1 - 1];
    30. $l2 = ($cut2 == 0) ? PHP_INT_MIN : $nums2[$cut2 - 1];
    31. // 分割点右边数
    32. $r1 = ($cut1 == count($nums1)) ? PHP_INT_MAX : $nums1[$cut1];
    33. $r2 = ($cut2 == count($nums2)) ? PHP_INT_MAX : $nums2[$cut2];
    34. if ($l1 > $r2) {
    35. $cutR = $cut1 - 1;
    36. } else if ($l2 > $r1) {
    37. $cutL = $cut1 + 1;
    38. } else {
    39. if ($len % 2 == 0) {
    40. $l1 = $l1 > $l2 ? $l1 : $l2;
    41. $r1 = $r1 < $r2 ? $r1 : $r2;
    42. return ($l1 + $r1) / 2;
    43. }
    44. return min($r1, $r2);
    45. }
    46. }
    47. }
    48. $nums1 = [1, 2, 3, 5];
    49. $nums2 = [4, 6, 7, 8, 9];
    50. $ret = findMedianSortedArrays($nums1, $nums2);
    51. print_r($ret);