兩個數組的交集(重複元素)
- 可以採用
349
那樣,先對數組進行排序
,然後使用雙指針,遍歷數組,進行判斷
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
List<Integer> list = new ArrayList<>();
int nums1Index = 0;
int nums2Index = 0;
while (nums1Index<nums1.length&&nums2Index<nums2.length){
if(nums1[nums1Index]==nums2[nums2Index]){
list.add(nums1[nums1Index]);
nums1Index++;
nums2Index++;
}else if(nums1[nums1Index]<nums2[nums2Index]){
nums1Index++;
}else{
nums2Index++;
}
}
int[] rs = new int[list.size()];
for(int i=0;i<rs.length;i++){
rs[i]=list.get(i);
}
return rs;
}
- 如果nums2的元素存儲在磁盤上,磁盤內存是有限的,並且不能一次加載所有的元素到內存中,使用
HashMap
來跟蹤每個數字出現的次數,檢查數組的大小並對較小的數組進行哈希映射
是一個小細節,當其中一個數組較大時,會減小內存使用。
public int[] intersect2(int[] nums1, int[] nums2){
Map<Integer,Integer> map = new HashMap<>();
for(Integer i:nums1){
int count = 0;
if(map.containsKey(i)){
count=map.get(i);
}
count++;
map.put(i,count);
}
List<Integer> list = new ArrayList<>();
for(Integer i:nums2){
int cnt = map.getOrDefault(i,0);
if(cnt>0){
list.add(i);
map.put(i,cnt-1);
}
}
int[] rs = new int[list.size()];
for(int i=0;i<list.size();i++) rs[i]=list.get(i);
return rs;
}