leetcode349. 两个数组的交集
一、题目描述
给定两个数组 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
二、题目解析
1、set+list
class Solution {public int[] intersection(int[] nums1, int[] nums2) {HashSet<Integer> set = new HashSet();List<Integer> list = new ArrayList();for(int i = 0;i < nums1.length;i++){set.add(nums1[i]);}for(int i = 0;i < nums2.length;i++){if(set.contains(nums2[i])){list.add(nums2[i]);//输出的交集必须是元素唯一set.remove(nums2[i]);}}int[] res = new int[list.size()];for(int i = 0;i < list.size();i++){res[i] = list.get(i);}return res;}
}
2、两个set
class Solution {public int[] intersection(int[] nums1, int[] nums2) {HashSet<Integer> set = new HashSet();HashSet<Integer> set1 = new HashSet();for(int i = 0;i < nums1.length;i++){set.add(nums1[i]);}for(int i = 0;i < nums2.length;i++){if(set.contains(nums2[i])){set1.add(nums2[i]);}}int[] res = new int[set1.size()];int j = 0;for(Integer num : set1){res[j++] = num;}return res;}
}
3、双指针
class Solution {public int[] intersection(int[] nums1, int[] nums2) {Arrays.sort(nums1);Arrays.sort(nums2);int i = 0,j = 0,end = 0;int[] res = new int[nums1.length + nums2.length];while(i < nums1.length && j < nums2.length){if(nums1[i] < nums2[j]){i++;}else if(nums1[i] > nums2[j]){j++;}else{//判断结果集不存在此元素才添加元素if(end == 0 || nums1[i] != res[end - 1]){res[end++] = nums1[i];}i++;j++;}}//截取数组并进行复制:copyOfRange(int []original,int from,int to),original为原始的int型数组,from为开始角标值,to为终止角标值。(其中包括from角标,不包括to角标。即处于[from,to)状态)return Arrays.copyOfRange(res,0,end);}
}