Leetcode基础刷题之PHP解析(56. Merge Intervals)


 2019-7-29 星期一 开始吧

上一题链接Leetcode刷题之PHP解析(96. Unique Binary Search Trees)

82201b1aa1b0c03ac89e0a82d0c9da09.png

题目描述

给定一个二维数组,合并他们的重叠的部分。


题目分析

这道题挺有意思的,如果相邻两个数组之间没有重叠的部分,那么他们还是他们,只要有重叠的部分,就需要把两组数组合并,新的数组位置0处是最小值,1处是最大值。先看我第一版的解,有bug

整体思路新建一个数组用来存储最终的结果,每次从数组中取出最后一组最为参照点,只要当前遍历数组中的第一个数大于参照点的最后一个数,说明这两个数组间没有交集,那么直接push到新数组中,否则取他们中的最小值,和最大值作为新数组的最小值和最大值。但是有一个bug就是比如下面这种情况


[[4,5][6,7],[8,9],[1,10]]


如果是这种情况,答案应该返回[1,10],按照我上面做的,结果就是[[4,5],[6,7],[1,10]],显然GG。因为给定的二维数组是无序的,我们只要把二维数组变成有序的即可。


代码实现

 /**
     * @param Integer[][] $intervals
     * @return Integer[][]
     */
    function merge($intervals) {
        if(empty($intervals)) return [];
        foreach($intervals as $key=>$val){
            $nums1[$key]=$val[0];
            $nums2[$key]=$val[1];
            
        }
        array_multisort($nums1,SORT_ASC,$nums2,SORT_ASC,$intervals);
        $res[]=$intervals[0];
        for($i=1;$i<count($intervals);$i++){
            if(end($res)[1]<$intervals[$i][0]){
                array_push($res,$intervals[$i]);
            }else{
                $res[count($res)-1][1]=max(end($res)[1],$intervals[$i][1]);
            }
        }
        return $res;
    }

Vote Vote Cancel Collect Collect Cancel

<< 上一篇: Leetcode PHP题解--D110 796. Rotate String

>> 下一篇: Leetcode基础刷题之PHP解析(54. Spiral Matrix)