文章目录
- 题目
- 方法一:哈希表
- 方法二:双指针
题目
方法一:哈希表
- 用哈希表记录第一个数组的每个数和每个数的出现次数
- 再遍历第二个数组,如果哈希表中有这个数,并且次数还不为0,说明是交集元素,加入结果集,(并且让该数的次数-1)如果哈希表右这个元素,但是次数为0 了,就不能加入结果集了。若遇到哈希表没有的数,直接跳过
参考链接两个数组的交集 II
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> map = new HashMap<>();
List<Integer> res = new ArrayList<>();
for(int i : nums1){
if(!map.containsKey(i)) map.put(i,1);
else map.put(i,map.get(i)+1);
}
for(int i : nums2){
if(!map.containsKey(i)) continue;
else if(map.get(i) > 0){
map.put(i,map.get(i)-1);
res.add(i);
}
}
int[] array = new int[res.size()];
for (int i = 0; i < res.size(); i++) {
array[i] = res.get(i);
}
return array;
}
}
方法二:双指针
- 首先就是要对两个数组进行排序
- 然后再根据指针进行循环比较,若相等,则记录位置元素到结果集,如果其中一个大于另一个。那就移动小的一方的指针,再比较,直到一方的指针走完自己的数组长度了
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
List<Integer> list = new ArrayList<>();
int nums1len = 0;
int nums2len = 0;
while(nums1len < nums1.length && nums2len < nums2.length){
if(nums1[nums1len]==nums2[nums2len]) {
list.add(nums1[nums1len]);
nums1len++;
nums2len++;
}else if(nums1[nums1len] > nums2[nums2len]) nums2len++;
else nums1len++;
}
int[] res = new int[list.size()];
int i = 0;
for(int j : list)
res[i++] = j;
return res;
}
}