题目:
给定两个数组,编写一个函数来计算它们的交集。
示例:
代码:
- 解法一
//利用集合实现
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
TreeSet<Integer> set=new TreeSet<Integer>();
for(Integer nums:nums1){ //将nums1的元素放入数组中
set.add(nums);
}
ArrayList<Integer> list=new ArrayList<Integer>(); //将交集元素放入链表存储
for(Integer nums:nums2){
if(set.contains(nums)){ //如果这个元素是交集元素
list.add(nums); //将这个元素放入链表中
set.remove(nums); //将集合中的这个元素删除 以防有重复元素
}
}
int[] res=new int[list.size()];
for(int i=0;i<list.size();i++){ //将链表用数组存储
res[i]=list.get(i);
}
return res;
}
}
- 解法二
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> hash = new HashSet<>();
int[] result = new int[nums1.length > nums2.length ? nums2.length : nums1.length];
for (int tmp : nums1) {
hash.add(tmp);
}
int idx = 0;
for (int tmp : nums2) {
if (hash.contains(tmp)) {
result[idx++] = tmp;
hash.remove(tmp);
}
}
int[] last = new int[idx];
for (int i = 0; i < idx; i++) {
last[i] = result[i];
}
return last;
}
}
- 别人的代码
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
//获取nums1的取值范围
for (int num : nums1) {
if (num > max) {
max = num;
}
if (num < min) {
min = num;
}
}
//使用bool数组保存nums1的值作为匹配对象,巧妙的避免排序
boolean[] arr = new boolean[max - min + 1];
for (int num : nums1) {
arr[num - min] = true;
}
int size = 0;
int[] result = new int[max - min + 1];
//将nums2中的数字取出,与arr比较
//不在范围内的直接丢弃不考虑
for (int num : nums2) {
if (num >= min && num <= max && arr[num - min]) {
result[size++] = num;
//避免重复数字出现,如果不控制,则允许加入多个相同数值
arr[num - min] = false;
}
}
int[] finalResult = new int[size];
for (int m = 0; m < size; m++) {
finalResult[m] = result[m];
}
return finalResult;
}
}