本文已参与「新人创作礼」活动,一起开启掘金创作之路
349. 两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。
说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
不难,先把一个数组去重,用set,再用一个表示所有数的标记数组,遍历第二个数组,看看每个元素是否被contains在第一个数组里,如果存在,则该数字的位置标记存在。最后再统计大小,返回结果数组。
package com.programmercarl.hashtable;
import java.util.HashSet;
/**
* @ClassName Intersection
* @Descriotion https://leetcode.cn/problems/intersection-of-two-arrays/
* @Author nitaotao
* @Date 2022/6/20 14:32
* @Version 1.0
* 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
* 两个数组的交集
**/
public class Intersection {
public static void main(String[] args) {
intersection(new int[]{4, 9, 7,7,6,7}, new int[]{5,0,0,6,1,6,2,2,4});
}
public static int[] intersection(int[] nums1, int[] nums2) {
//数组去重
HashSet<Integer> set1 = new HashSet<Integer>();
for (int i : nums1) {
set1.add(i);
}
//数的范围是 [0,1001]
int[] resultTemp = new int[1001];
for (int i : nums2) {
if (set1.contains(i)) {
//如果包含此数
resultTemp[i] += 1;
}
}
int count = 0;
//因为返回结果要的是数组,所以最后得转成数组
for (int i = 0; i < 1001; i++) {
if (resultTemp[i] != 0) {
count++;
}
}
int[] result = new int[count];
for (int i = 0, j = 0; i < 1001; i++) {
if (resultTemp[i] != 0) {
result[j] = i;
j++;
}
}
return result;
}
}
发现这个题之前做过
public int[] intersection(int[] nums1, int[] nums2) {
TreeSet<Integer> treeSet = new TreeSet();
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
if (nums1[i] == nums2[j]) {
treeSet.add(nums1[i]);
}
}
}
int[] intersection = new int[treeSet.size()];
Iterator<Integer> iterator = treeSet.iterator();
int index = 0;
while (iterator.hasNext()) {
intersection[index] = iterator.next();
index++;
}
return intersection;
}
六个月前做的,效率不如现在的,果然人还是在进步的。 之前思路是直接暴力两层遍历。如果相等,添加到set,再处理成需要返回的数组。