两数组的交集(多种方法)

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

示例 1:

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

示例 2:

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

说明:

  1. 输出结果中的每个元素一定是唯一的。
  2. 我们可以不考虑输出结果的顺序。

这题比较简单,有很多种方法和思路!如果你觉得自己会了,就不需要往下看了!下面我们介绍下一些常用的思路和方法并加于分析!

遍历循环

直观的方法是遍历数组 nums1,对于其中的每个元素,遍历数组 nums2 判断该元素是否在数组 nums2 中,如果存在,则将该元素添加到返回值。假设数组 nums1 和 nums2 的长度分别是 m 和 n,则遍历数组 nums1 需要 O(m)的时间,判断 nums1 中的每个元素是否在数组 nums2 中需要 O(n)的时间,因此总时间复杂度是 O(mn)。这种方法大家最容易想到,也是最耗时的!

let intersection = (nums1,nums2) => {
     let arr = [];
     for (var i = 0; i < nums1.length; i++) {
         for (var j = 0; j < nums2.length; j++) {
             if (nums1[i] === nums2[j]) {
                 arr.push(nums1[i]);
             };
         };
     };
     return [...new Set(arr)];
 }

遍历循环(变种)

可以在 O(1)的时间内判断一个元素是否在集合中,从而降低时间复杂度。先遍历较小的集合,判断其中的每个元素是否在另一个集合中,如果元素也在另一个集合中,则将该元素添加到返回值。该方法的时间复杂度可以由相乘降低到相加。

let intersection = (nums1, nums2) => {
   let arr = [];
   if (nums1.length > nums2.length) {
       return intersection(nums2, nums1);
   };
   for (let item of nums1) {
       if (nums2.includes(item)) arr.push(item);
   };
   return [...new Set(arr)];
};

set+filter

let intersection = (nums1, nums2) => {
    return [...new Set(nums1)].filter((item) => {
        return nums2.includes(item);
    });
};

reduce+indexOf

let intersection = (nums1, nums2) => {
   return nums1.reduce((prev, next) => !prev.includes(next) && nums2.includes(next) ? [...prev, next] : prev, []);
};

排序+双指针

首先对两个数组进行排序,然后使用两个指针遍历两个数组。初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,把此数字加入答案中(去同操作),同时将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。

let intersection = (nums1, nums2) => {
    let i = 0,
        j = 0;
    arr = [];
    nums1 = nums1.sort((a, b) => {
        return a - b;
    });
    nums2 = nums2.sort((a, b) => {
        return a - b;
    });
    while (i < nums1.length && j < nums2.length) {
        if (nums1[i] == nums2[j]) {
            arr.includes(nums1[i]) ? arr : arr.push(nums1[i]);
            i++;
            j++;
        } else if (nums1[i] > nums2[j]) {
            j++;
        } else {
            i++;
        };
    };
    return arr;
};

排序+二分法查找

把第一个数组排序,然后遍历第二个数组的值,判断是否在第一个数组中,这里使用的是二分法查找(不懂的点击这里),看下代码

let intersection = (nums1, nums2) => {
   nums2.sort((a, b) => a - b);
   let arr = [];
   let binarySearch = (number, arr) => {
       let left = 0;
       let right = arr.length - 1;
       while (left <= right) {
           let middle = parseInt((left + right) / 2);
           if (number == arr[middle]) {
               return true
           } else if (number > arr[middle]) {
               left = middle + 1;
           } else if (number < arr[middle]) {
               right = middle - 1;
           };
       };
       return false;
   };
   for (var i = 0; i < nums1.length; i++) {
       if (binarySearch(nums1[i], nums2)) {
           arr.push(nums1[i]);
       };
   };
   return [...new Set(arr)];
}
可以使用多种方法来获取Python数组交集方法一:使用列表推导式和in操作符 ```python a = [2, 3, 4, 5] b = [2, 5, 8] tmp = [val for val in a if val in b] print(tmp) # [2, 5] ``` 方法二:使用set的intersection方法 ```python a = [2, 3, 4, 5] b = [2, 5, 8] print(list(set(a).intersection(set(b)))) # [2, 5] ``` 方法三:使用集合的交集运算符& ```python a = [2, 3, 4, 5] b = [2, 5, 8] print(list(set(a) & set(b))) # [2, 5] ``` 以上是三种常见的方法获取Python数组交集。你可以根据实际情况选择其中一种方法来使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python 获得数组交集、并集、差集的方法](https://blog.csdn.net/sunny_day_day/article/details/126208046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数组交集Python解法](https://blog.csdn.net/qq_43593534/article/details/127178466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值