LeetCode-349. 两个数组的交集
题目来源
题目详情
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
解释: [4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
题解分析
解法一:双指针
- 本题最直观的求解方法其实是使用set来去重并取交集,但是这种方法需要引入set这个数据结构,所以显得比较麻烦。
- 还有另外一种解法是使用双指针,因为题目要求是要求交集,所谓的交集就是数值相等的元素,所以,我们可以先对数组进行排序,然后分别设置一个指针来移动两个数组的元素,当指针指向的元素相同时则表示这个元素是重复的,将作为结果值存起来。
- 这里有一个小细节就是Arrays.copyOf数组的使用,这是比较容易搞混的,因为System.arraycopy也是用于拷贝数组的,它们之间的最大区别就是,Arrays.copyOf底层也是调用的System.arraycopy这个方法,而且Arrays.copyOf是返回一个新的数组,而System.arraycopy是传入新数组作为参数。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int n = nums1.length;
int m = nums2.length;
Arrays.sort(nums1);
Arrays.sort(nums2);
int ptr1 = 0, ptr2 = 0;
int num1, num2;
int[] result = new int[Math.min(n, m)];
int index = 0;
while(ptr1 < n && ptr2 < m){
num1 = nums1[ptr1];
num2 = nums2[ptr2];
if(num1 < num2){
ptr1++;
}else if(num1 > num2){
ptr2++;
}else{
ptr1++;
ptr2++;
if(index > 0 && num1 == result[index-1]){
continue;
}
result[index++] = num1;
}
}
return Arrays.copyOf(result, index);
}
}
Either Excellent or Rusty
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了