方法一:遍历第一个数组将第一个集合的元素作为hashmap的键,该元素出现的次数作为hashmap的值;遍历第二个数组的元素并查询元素是否出现在hashmap中,如果出现一次,则将该元素添加到列表list中数组中,并将hash值-1,只到hash值减为0,就将该键删除。最后输出将list的元素添加到数组中做输出
方法二:先将两个数组排序,设置两个指针index1和index2,比较两个指针指向的元素,如果相等将该元素添加到列表list中,两个指针自增,否则指针指向元素值小的那个指针自加,值大的不变。直到指针指向元素较少的数组的最后一个元素。
方法一:HashMap法
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
List<Integer> list = new ArrayList<Integer>();
for(int num:nums1){
if(map.containsKey(num)){
map.put(num,map.get(num)+1);
}else{
map.put(num,1);
}
}
for(int num:nums2){
if(map.containsKey(num)){
map.replace(num,map.get(num)-1);
if(map.get(num) == 0){
map.remove(num);
}
list.add(num);
}
}
int[] nums = new int[list.size()];
for (int i = 0; i <list.size() ; i++) {
nums[i] = list.get(i);
}
return nums;
}
}
方法二:排序指针法
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int index1 = 0, index2 = 0;
int len1 = nums1.length;
int len2 = nums2.length;
List<Integer> list = new ArrayList<>();
while(index1< len1 && index2 < len2){
if(nums1[index1] == nums2[index2]){
list.add(nums1[index1]);
index1++;
index2++;
}else if(nums1[index1] < nums2[index2]){
index1++;
}else {
index2++;
}
}
int[] nums = new int[list.size()];
for (int i = 0; i <list.size() ; i++) {
nums[i] = list.get(i);
}
return nums;
}
}
原文:https://www.cnblogs.com/sinlearn/p/13423185.html