“热爱可抵岁月漫长。”
标签:数组、哈希表、双指针、二分查找、排序
题目链接:
题目描述:
给定两个数组 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:2个数组
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<Integer>();
int len1 = nums1.length;
int len2 = nums2.length;
for(int i =0;i<len1;i++){
set.add(nums1[i]);
}
// 交集数组
Set<Integer> set1 = new HashSet<Integer>();
for(int i = 0;i<nums2.length;i++){
if(set.contains(nums2[i])){
set1.add(nums2[i]);
}
}
// 数组转set
int[] arr = new int[set1.size()];
int index = 0;
for (int num : set1) {
arr[index++] = num;
}
return arr;
}
}
方法2:排序+双指针
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 对数组进行排序
Arrays.sort(nums1);
Arrays.sort(nums2);
int len1 = nums1.length, len2 = nums2.length;
// 交集数组的大小,最大也就是:长度较短数组的大小
int len = len1<len2? len1:len2;
int[] newArr = new int[len];
int index = 0, index1 = 0, index2 = 0;
// 在数组不越界的情况下,将 数值进行对比
while(index1 < len1 && index2 < len2){
if(nums1[index1] == nums2[index2]){
// 保证数值不重复,相等的数值上一个没有保存过(有序数组)
if(index == 0 || newArr[index-1] != nums1[index1]){
newArr[index++] = nums1[index1];
}
index1++;
index2++;
// 数值不相等时,将较小数值的坐标右移
}else if(nums1[index1] < nums2[index2]){
index1++;
}else{
index2++;
}
}
// 将newArr,从下标0开始复制,复制到上标index,生成一个新的数组。
// 注意这里包括下标0,不包括上标to。
return Arrays.copyOfRange(newArr, 0, index);
}
}