题目描述
做法1
思路
第一步:先初始化两个Set集合,Set集合的特点是里面的元素是无序的,不能根据索引操作,然后里面不可以有重复元素,这样就帮我们把重复的相同元素去掉了
第二步:把数组1中的所有元素添加到集合Set1
中,然后在遍历数组2nums2
第三步: 判断集合Set1
中是否存在nums2
中的元素
第四步:如果存在就把他们单独的放在另一个set2
集合中,set2
中存放的就是num1
数组中和nums2
数组的交集
第五步:在这个set2
集合转为数组然后返回结果。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set <Integer> set1 = new HashSet<>();
Set <Integer> set2 = new HashSet<>();
for(int i = 0;i < nums1.length;i++){//循环遍历数组1
set1.add(nums1[i]);//把他添加到集合中
}
for(int i = 0; i< nums2.length;i++){//循环遍历数组2
if(set1.contains(nums2[i])){//如果集合1中包含数组2中的元素,contains这个是集合中的包含方法
set2.add(nums2[i]);//添加到集合2中
}
}
//把set2集合转换为数组
int i = 0;
int[] arr = new int [set2.size()];
for(Integer num : set2){//这里用增强for循环,因为用set集合是无序的,没发根据索引遍历,用普通的for循环遍历就是用索引遍历
arr[i++] = num;
}
return arr;
}
}
做法-双指针
第一步:对两个数组进行排序
第二步:定义两个指针,一个指向数组1的第一个元素,一个指向数组2的第一个元素
第三步:用着两个指针遍历数组,如果这两个指针指向的值是一样的,就把他加入到集合中,如果两个指针指向的值不一样,就把指向小的值的指针像右移动一位。
i 指针指向的值不等于j指针指向的值,i指针向右移动一位.
i指针指向的元素=j指针指向的元素,然后我们把这个元素添加到我们定义的集合中,之后分别移动i,j指针.
i 指针指向的值不等于j指针指向的值,这两个指针也分别到了数组的结尾,结束循环.
//用set集合,set集合去重,不懂单独去重
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//先对两个数组进行排序
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;//定义第i指针指向数组1
int j = 0;//定义第j指针指向数组2
Set<Integer> mset = new HashSet<>();
while (i < nums1.length && j < nums2.length) {
//这里思路可以参照归并排序。使用两个指针,只有nums1[i] == nums2[j]
//的时候,他们才有交集,否则值小的指针往后移
if (nums1[i] < nums2[j]) {
i++;
} else if (nums1[i] > nums2[j]) {
j++;
} else {
//使用的是list
mset.add(nums1[i]);
i++;
j++;
}
}
//这一大坨是把集合mset转化为数组
int k = 0;
int[] res = new int[mset.size()];
for (Integer num : mset) {
res[k++] = num;
}
return res;
}
}
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//先对两个数组进行排序
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;//数组1的指针
int j = 0;//数组2的指针
List<Integer> mList = new ArrayList<>();
while (i < nums1.length && j < nums2.length) {
//使用两个指针,只有nums1[i] == nums2[j]的时候,他们才有交集,否则值小的指针往后移
if (nums1[i] < nums2[j]) {
i++;
} else if (nums1[i] > nums2[j]) {
j++;
} else {
//这里是去掉重复的,使用的是list
if (mList.size() == 0 || mList.size() > 0 && mList.get(mList.size() - 1) != nums1[i])
mList.add(nums1[i]);
i++;
j++;
}
}
//把集合list转化为数组
int[] res = new int[mList.size()];
for (int k = 0; k < mList.size(); k++) {
res[k] = mList.get(k);
}
return res;
}
}