• 技术文章 >后端开发 >php教程

    php求两数组交集的三种方法详解

    藏色散人藏色散人2020-02-01 17:38:24转载1436

    题目:给定两个数组,编写一个函数来计算它们的交集。

    示例 1:

    输入: nums1 = [1,2,2,1],nums2 = [2,2]

    输出: [2]

    示例 2:

    输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]

    输出: [9,4]

    说明:

    输出结果中的每个元素一定是唯一的。

    我们可以不考虑输出结果的顺序。

    解法一:迭代一个数组

    思路分析:

    迭代一个数组,判断是否存在另外一个数组

    PHP 代码实现:

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer[]
     */
    function intersection($nums1, $nums2) {
        $res = [];
        for($i=0;$i<count($nums1);$i++){
            if(in_array($nums1[$i],$nums2)){
                $res[] = $nums1[$i];
            }
        }
        return array_unique($res);
    }

    使用:

    $nums2 = [2,4,6,7,8,99];
    $nums1 = [1,2,5,9,9,66,89,90,99,99];
    var_dump(intersection($nums1, $nums2));

    复杂度分析:

    时间复杂度:O(mn)

    解法二:内置数组函数

    思路分析:

    使用array_intersect()函数进行取数组的交集,然后再使用array_unique()去重

    PHP 代码实现:

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer[]
     */
    function intersection($nums1, $nums2) {
        return array_unique(array_intersect($nums1,$nums2));
    }

    使用:

    $nums2 = [2,4,6,7,8,99];
    $nums1 = [1,2,5,9,9,66,89,90,99,99];
    var_dump(intersection($nums1, $nums2));

    解法三:暴力解法

    思路分析:

    先把两个数组合并为一个数组,再两次循环遍历查找

    PHP 代码实现:

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer[]
     */
    function intersection($nums1, $nums2) {
        $new_arr = array_merge(array_unique($nums1),array_unique($nums2));
        $res = [];
        for($i=0;$i<count($new_arr);$i++){
            for($j=$i+1;$j<count($new_arr);$j++){
                if($new_arr[$i] == $new_arr[$j]){
                    $res[] = $new_arr[$i];
                }
            }
        }
        return array_unique($res);
    }

    使用:

    $nums2 = [2,4,6,7,8,99];
    $nums1 = [1,2,5,9,9,66,89,90,99,99];
    var_dump(intersection($nums1, $nums2));

    复杂度分析:

    时间复杂度:O(n^2)

    解法四:双指针

    思路分析:

    先把两个数组排序,通过双指针往前推来进行查找

    PHP 代码实现:

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer[]
     */
    function intersection($nums1, $nums2) {
        sort($nums1);
        sort($nums2);
        $i = $j = 0;
        $res = [];
        while($i < count($nums1) && $j < count($nums2)){
            if($nums1[$i] == $nums2[$j]){
                $res[] = $nums1[$i];
                $i++;
                $j++;
            }elseif($nums1[$i] < $nums2[$j]){
                $i++;
            }elseif($nums1[$i] > $nums2[$j]){
                $j++;
            }
        }
        return array_unique($res);
    }

    使用:

    $nums2 = [2,4,6,7,8,99];
    $nums1 = [1,2,5,9,9,66,89,90,99,99];
    var_dump(intersection($nums1, $nums2));

    复杂度分析:

    时间复杂度:O(nlogn)

    更多php相关知识,请访问php教程

    以上就是php求两数组交集的三种方法详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:PHP实现页面静态化、纯静态化及伪静态化 下一篇:linux下php安装php-kafka和php-rdkafka扩展的方法详解
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• php获取农历、节日、节气的方法(代码实例)• Windows php5.6安装Imagick库的方法详解• php用逗号格式化数字的方法(代码示例)• PHP实现页面静态化、纯静态化及伪静态化
    1/1

    PHP中文网