【LeetCode】349. 两个数组的交集

349. 两个数组的交集

知识点:set; 双指针

题目描述

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

示例
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4]

解法一:set

交集,这不就是说的重复吗?果断想到set;遍历一个数组,把不重复的存入set,再遍历另一个数组,如果set里有,那就是一个交集,防止多算,把它移除,接着遍历。

class Solution { public int[] intersection(int[] nums1, int[] nums2) { List<Integer> list = new ArrayList<>(); Set<Integer> set = new HashSet<>(); for(Integer i : nums1){ if(!set.contains(i)) set.add(i); } for(Integer i : nums2){ if(set.contains(i)){ set.remove(i); list.add(i); } } return list.stream().mapToInt(Integer::valueOf).toArray(); //要学会这个list<Integer>转为int[];此外也可以这样 //index = 0; //int[] arr = new int[list.size()]; //for(Integer i : list){ // arr[index++] = i; //} //return arr; } }

时间复杂度:O(N+M);

解法二:排序+双指针

先将两个数组排序,这样两个数组都是从小到大了,然后使用两个指针同时遍历这两个数组,如果两个指针指的元素相等就是交集加入list,如果两个指针指的值不等,则移动较小的元素,接着比较。直到有一个指针走到了头。其实就是维持了一个从小到大的顺序。这样方便比较
注意要比较新加入的值和已经加入的值是否相同;

class Solution { public int[] intersection(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); int length1 = nums1.length, length2 = nums2.length; List<Integer> list = new ArrayList<>(); int index = 0, index1 = 0, index2 = 0; while (index1 < length1 && index2 < length2) { int num1 = nums1[index1], num2 = nums2[index2]; if (num1 == num2) { // 保证加入元素的唯一性 if (list.size() == 0 || num1 != list.get(list.size() - 1)) { list.add(num1); } index1++; index2++; } else if (num1 < num2) { index1++; } else { index2++; } } int[] arr = new int[list.size()]; for(Integer i : list){ arr[index++] = i; } return arr; } }

相关题目

350 两个数组的交集II


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15054463.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(77)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】349. 两个数组的交集』
点击右上角即可分享
微信分享提示