349. 两个数组的交集
1.题目来源:
- 1 两个数组的交集
- 2.leetCode
2.题目说明:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
3.思路:
3.1 直接判断
直接判断就是先把num1中的所有元素全部添加到集合set1中,然后遍历nums2中的所有元素,判断在集合set1中是否存在,如果存在,说明有交集,就把他添加到集合resSet中,最后再把resSet转化为数组
3.2先排序然后二分法查找
把第一个数组排序,然后遍历第二个数组的值,判断是否在第一个数组中,这里使用的是二分法查找的数量
4.上代码:
4.1 直接判断:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> resSet = new HashSet<>();
for(int i= 0 ;i<nums1.length;i++){
set1.add(nums1[i]);
}
for(int j=0;j<nums2.length;j++){
if(set1.contains(nums2[j])){
resSet.add(nums2[j]);
}
}
int i=0;
int []sum= new int[resSet.size()];
for(Integer n : resSet){
sum[i++] = n;
}
return sum;
}
}
4.2先排序然后二分法查找
public int[] intersection(int[] nums1, int[] nums2) {
//先对数组进行排序
Arrays.sort(nums1);
Set<Integer> resSet = new HashSet<>();
for (int i = 0; i < nums2.length; i++) {
//通过二分法查找,判断num2[i]是否存在于num1中
if (binarySearch(nums1, nums2[i]))
resSet.add(nums2[i]);
}
//这一大坨是把集合set转化为数组
int[] res = new int[resSet.size()];
int k = 0;
for (Integer num : resSet) {
res[k++] = num;
}
return res;
}
//二分法查找
private boolean binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
int midValue = nums[mid];
if (midValue == target) {
return true;
} else if (midValue > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return false;
}