题目链接
LeetCode349. 两个数组的交集
题目描述
题解
题解一(Java)
作者:@仲景
因为数据范围和长度都限制在1000,所以直接使用数组即可
因为数据范围和长度都在1000内,所以碰到数字可以直接arr[i] = i来表示这个数字出现的次数
但是因为Java数组默认值是0,所以我们需要对arr的默认值初始化为-1,不然0没有办法统计
需要注意的是我们不需要重复的元素,所以每次arr[i] ≠ -1后,我们要手动把arr[i]改成-1,那么下次就不会再访问到了
时间复杂度:O(n)
空间复杂度:老多了
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 声明一个1001长度的数组
int[] arr = new int[1001];
// 声明一个1001长度的数组,保存返回结果
int[] result = new int[1001];
int index = 0;
// 全部设置成-1
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
}
// 遍历nums1
for (int i : nums1) {
arr[i] = i;
}
// 遍历nums2,如果当前数字存在,就记录在结果集中
for (int i : nums2) {
if (arr[i] != -1) {
result[index++] = i;
arr[i] = -1;
}
}
// 拷贝结果数组
int[] result2 = new int[index];
for (int i = 0; i < index; i++) {
result2[i] = result[i];
}
return result2;
}
}
题解二(Java)
作者:@仲景
碰到去重的题,调库一定是Set,因为Set天然去重
思路和题解一类似,把一个数组的所有元素都入到Set中,然后遍历第二个数组,如果Set中存在,就是交集
使用Set保存交集,不需要像方法一一样麻烦,因为Set会自己去重
最后把Set转成数组即可
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 创建两个hash表
Set<Integer> numsSet = new HashSet<>();
Set<Integer> result = new HashSet<>();
// 遍历数组1
for (int i : nums1) {
numsSet.add(i);
}
// 遍历数组2,碰到和num1重复的就添加到结果集中
for (int i : nums2) {
if (numsSet.contains(i))
result.add(i);
}
// 把结果集转成数组
int[] res = new int[result.size()];
int index = 0;
for (Integer i : result) {
res[index++] = i;
}
return res;
}
}