LeetCode PHP题解 4. 寻找两个正序数组的中位数

题目链接

4. 寻找两个正序数组的中位数 难度:hard

有点类似TopK问题,只是这里是有有序的,且是两个数组中寻找,二分找到中位数即可。

解法

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语言实现~~~~

class Solution {

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Float
     */
    function findMedianSortedArrays($nums1, $nums2) {
        $a = $nums1;
        $b = $nums2;
        $m = count($a);
        $n = count($b);
        if ($m > $n) {
            return $this->findMedianSortedArrays($nums2, $nums1);
        }
        $mid = (int)(($m+$n+1)/2);
        $i_min = 0;
        $i_max = $m;
        $count = 0;
        while ($i_min <= $i_max) {
            $i = (int)(($i_min + $i_max)/2);
            $j = $mid - $i;
            if ($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];
                }else{
                    $max_left = $a[$i-1] > $b[$j-1] ?$a[$i-1]:$b[$j-1];
                }
                if (($m+$n)%2 == 1) {
                    return $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;
                return $res;
            }
        }
    }
}

你可能感兴趣的:(leetcode,php)