题目:
思路:
①为了较小的空间复杂度,遍历较短的数组,生成一个哈希映射,Key为元素,Value为出现次数
②接下来遍历较长的数组,每当遇见重复的元素,Value-1,输出结果,当Value =0时,不再输出结果,因为输出结果中元素出现次数应与元素在两个数组中出现次数的最小值一致
代码:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length) {//降低空间复杂度
return intersect(nums2, nums1);
}
Map<Integer,Integer> hashmap = new HashMap<Integer,Integer>();
List<Integer> ans = new LinkedList<Integer>();
for(int i= 0;i < nums1.length;i++){
hashmap.put(nums1[i],hashmap.getOrDefault(nums1[i],0)+1);
}
for(int i= 0;i < nums2.length;i++){
if(hashmap.containsKey(nums2[i])){
if(hashmap.get(nums2[i]) > 0){
ans.add(nums2[i]);
hashmap.put(nums2[i],hashmap.get(nums2[i]) - 1);
}
}
}
int[] ans_arr = new int[ans.size()];
for(int i = 0;i < ans.size();i++){
ans_arr[i] = ans.get(i);
}
return ans_arr;
}
}
复杂度分析:
时间复杂度:O(m+n)
空间复杂度:O(min(m,n))