文章目录

  • 题目
  • 分析
  • Code
    • 方式一 :Set + 数组
    • 方式二: 两个 set
    • 方式三: 内置函数


题目

https://leetcode-cn.com/problems/intersection-of-two-arrays/


分析

幼稚的方法是根据第一个数组 nums1 迭代并检查每个值是否存在在 nums2 内。如果存在将值添加到输出。这样的方法会导O(n×m) 的时间复杂性,其中 n 和 m 是数组的长度。

为了在线性时间内解决这个问题,我们使用集合 set,在 O(1) 时间复杂度实现操作。

其思想是将两个数组转换为集合 set,然后迭代较小的集合检查是否存在在较大集合中。平均情况下,这种方法的时间复杂度为 O(n+m)


Code

方式一 :Set + 数组

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;/*** * * @ClassName: Solution* * @Description: 给定两个数组,编写一个函数来计算它们的交集。* *               输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。* @author: Mr.Yang* * @date: 2020年2月9日 下午3:39:28*/
public class Solution {public int[] intersection(int[] nums1, int[] nums2) {// 保存目标元素的集合List<Integer> targetList = new ArrayList<>();// set 元素不重复 ,存放数组1Set<Integer> set = new TreeSet<>();for (int num : nums1) {set.add(num);}// 遍历数组2,判断是数组2中的每个元素是否在数组1中// 存在则加入到targetList// 同时为了防止数组2有重复的数据,导致targetList重复,所以要移除set中的元素,防止重复for (int num2 : nums2) {if (set.contains(num2)) {targetList.add(num2);set.remove(num2);}}// list转数组int[] target = new int[targetList.size()];for (int i = 0; i < target.length; i++) {target[i] = targetList.get(i);}return target;}public static void main(String[] args) {Solution solution = new Solution();int[] target = solution.intersection(new int[] { 1, 2, 2, 1 }, new int[] { 2, 2 });for (int i = 0; i < target.length; i++) {System.out.println(target[i] + ",");}}
}

方式二: 两个 set

public int[] intersection3(int[] nums1, int[] nums2) {// 数组1 入setHashSet<Integer> set1 = new HashSet<Integer>();for (Integer n : nums1) {set1.add(n);}// 数组2 入setHashSet<Integer> set2 = new HashSet<Integer>();for (Integer n : nums2) {set2.add(n);}// 比较if (set1.size() < set2.size()) {return setIntersection(set1, set2);} else {return setIntersection(set2, set1);}}/*** * * @Title: setIntersection* * @Description: 迭代较小的集合检查是否存在在较大集合中 减少遍历次数* * @param smallSet* @param largeSet* * @return: int[]*/private int[] setIntersection(HashSet<Integer> smallSet, HashSet<Integer> largeSet) {int[] target = new int[smallSet.size()]; // 先开辟一个小的内存区域int idx = 0;// 下面的这种遍历,没有下标,定义一个索引下标for (int num : smallSet) {// 迭代较小的集合检查是否存在在较大集合中 减少遍历次数if (largeSet.contains(num)) {// target[idx] = num;// idx++;// 上面两行可以直接写成如下target[idx++] = num;}}return Arrays.copyOf(target, idx); // 返回idx长度的数组,避免出现多余的0}

复杂度分析

  • 时间复杂度:O(m+n),其中 n 和 m 是数组的长度。 O(n) 的时间用于转换 nums1 在集合中, O(m) 的时间用于转换 nums2 到集合中,并且平均情况下,集合的操作为 O(1)
  • 空间复杂度:O(m+n),最坏的情况是数组中的所有元素都不同。

方式三: 内置函数

内置的函数在一般情况下的时间复杂度是 O(n+m) 且时间复杂度最坏的情况是 O(n×m) ,在 Java 提供了 retainAll() 函数.

public int[] intersection(int[] nums1, int[] nums2) {// 数组1 入setHashSet<Integer> set1 = new HashSet<Integer>();for (Integer n : nums1)set1.add(n);// 数组2 入setHashSet<Integer> set2 = new HashSet<Integer>();for (Integer n : nums2)set2.add(n);// 内置函数set1.retainAll(set2);// set转数组int[] output = new int[set1.size()];int idx = 0;for (int s : set1)output[idx++] = s;return output;}

复杂度分析

  • 时间复杂度:一般情况下是 O(m+n),最坏情况下是 O(m×n)
  • 空间复杂度:最坏的情况是 O(m+n),当数组中的元素全部不一样时。

LeetCode_349. 两个数组的交集相关推荐

  1. 两个数组的交集 II

    两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 示例 2: 输入:nums1 ...

  2. 数组-两个数组的交集(两个集合)

    题意: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...

  3. 9.LeetCode第350题---两个数组的交集2

    一.目的 记录本题的主要目的是想让自己以及大家记住一个Java中的一个函数,可以去除数组中的后面无用的零 方法是Arrays.copyOfRange(res,0,index); 另外需要注意的是本题与 ...

  4. php 两个数组求交集_如何求两个数组的交集

    题目描述 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...

  5. Leetcode 350. 两个数组的交集 II 解题思路及C++实现

    解题思路: 和349. 两个数组的交集 这道题目很相似,这道题只是在返回的数组中,多了重复的数字,其实相较于349题,350题更简单. 先对两个数组进行排序,然后遍历这两个数组,找到相同的数字之后,就 ...

  6. 350. Intersection of Two Arrays II 两个数组的交集 II

    Title 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = ...

  7. php两个数组找公共部分,PHP开发中如何查找两个数组的交集

    在PHP中,可以使用内置函数array_intersect()来查找两个数组的交集,它可以返回两个数组的公共元素(相交部分).下面我们就来具体介绍一下. array_intersect()函数 基本语 ...

  8. leetcode初级算法4.两个数组的交集 II

    leetcode初级算法4.两个数组的交集 II 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法:(总结在代码中) public int[] intersect(int[] nums1, in ...

  9. 349. 两个数组的交集 golang

    349. 两个数组的交集 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: num ...

最新文章

  1. 服务器支持curl,互联网要点:服务器不支持curl_exec的解决办法
  2. 12、Java Swing计算器界面的实现
  3. Java编程基础25——多线程上
  4. 很少使用“ ControlFlowException”
  5. 赫夫曼树编码的算法及应用习题--数据结构
  6. 理想汽车下调第三季度交付展望 预计交付量约为2.45万辆
  7. pytorch torchvision.datasets.ImageFolder
  8. Java基础学习总结(170)——Java8并发工具类CompletableFuture学习总结
  9. python基础语法学习常见小问题
  10. 读书笔记之《阿里传:这是阿里巴巴的世界》
  11. 麦子学院I2C设备驱动201117
  12. Qt自定义DateTime控件--实现日历及时间选择器自定义
  13. JAVA范例 - Applet小应用程序
  14. 在国内访问AWS与阿里云速度如何?
  15. 社区计算机知识,社区公共基础知识备考指导——计算机知识
  16. 职场社交赛道上唯一的幸存者,脉脉做对了什么?
  17. (更新时间)2021年6月4日 商城高并发秒杀系统(.NET Core版) 30-lua文件封装加载和执行
  18. 理解ClassLoader
  19. oracle 备份命令
  20. 版权登记和商标注册的区别

热门文章

  1. html 链接app store,App Store 连接失败
  2. 多线程之pthread_create()函数
  3. es python demo
  4. java post 打开新页面_JAVA后台POST/GET访问方法
  5. python与其他编程语言对比优点_Python编程不同于其他编程语言的优点
  6. Leetcode 136.只出现一次的数字 (每日一题 20210714)
  7. Python科学计算包应用-教你以可视化的方式打开NumPy
  8. tensorflow从入门到精通100讲(一)-如何申明一个tensor,Tensorflow中最重要的基本操作
  9. android获取连接wifi名称,android 获取当前连接WIFI名称的有关问题
  10. jupyter notebook中忽略所有警告,让页面更整洁