350. 两个数组的交集 II

方法一、排序+双指针

思路

使用 sort 函数(快排),然后利用双指针,比较两个数组中相同的值。

复杂度

时间复杂度:O(max(nlogn, mlogm))

空间复杂度:O(min(n, m)) ,其他语言中数组需要提前声明固定长度。

代码

class Solution {

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer[]
     */
    function intersect($nums1, $nums2) {
        sort($nums1);
        sort($nums2);
        $result = []; 
        for($i = 0, $j = 0; $i < count($nums1) && $j < count($nums2);) {
            if($nums1[$i] == $nums2[$j]) {
                $result[] = $nums1[$i];
                $i++;
                $j++;
            } else if($nums1[$i] > $nums2[$j]) {
                $j++;
            } else {
                $i++;
            }
        }

        return $result;
    }
}

方法二、哈希表

思路

利用哈希表,将数组一记录到哈希表中,哈希表的 key 为数组的元素,value 为该元素出现的次数。数组一记录到哈希表这个动作类似于一个生产者。

数组二扮演消费者的角色。遍历数组二,若数组二元素中有和哈希表中 key 相同且出现次数(value)大于0,则将哈希表对应次数减一,并输出。

复杂度

时间复杂度:O(max(n, m))

空间复杂度:O(min(n, m))

代码

class Solution {

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer[]
     */
    function intersect($nums1, $nums2) {
        $hash = [];
        $result = [];

        // 遍历 $nums1 放入 hash
        for($i = 0; $i < count($nums1); $i++) {
            if(isset($hash[$nums1[$i]])) {
                $hash[$nums1[$i]]++;
            } else {
                $hash[$nums1[$i]] = 1;
            }
        }

        // 遍历 $nums2 ,若 nums2 中有和哈希表中 key 相同且出现次数大于0,则将哈希表对应值减一,并输出。
        for($i = 0; $i < count($nums2); $i++) {
            if(isset($hash[$nums2[$i]]) && $hash[$nums2[$i]] > 0) {
                $hash[$nums2[$i]]--;
                $result[] = $nums2[$i];
            }
        }

        return $result;
    }
}

results matching ""

    No results matching ""