一,题目大意
给定两个数组,编写函数计算它们的交集。
注意:
结果中的每个元素的出现次数应与其在两个数组中同时出现的次数一样多。
结果可以采用任意顺序。
进一步思考:
如果数组已经排好序,怎样优化你的算法?
如果nums1的长度<nums2的长度?哪一种算法更好?
如果nums2的元素存储在磁盘上,并且内存大小有限,不足以将其一次性的加载到内存中。此时应当怎样做?
二,分析
1,这道题目和之前的一道题目很像,有一点不同的是:这里交集可以重复。
点击这里:之前的一个题目,也是求交集
2,同样的,这里可以用list遍历,也可以用map去计数。接下来会相应的讨论。
3,这里也可先排序后再处理
三、java处理
1,list方法:
public static int[] intersect(int[] nums1, int[] nums2) {
List<Integer> num1 = new ArrayList<Integer>();
List<Integer> res = new ArrayList<>();
for(int i=0;i<nums1.length;i++) {
num1.add(nums1[i]);
}
for(int i=0;i<nums2.length;i++) {
if(num1.contains(nums2[i])) {
res.add(nums2[i]);
num1.remove(nums2[i]);
}
}
int[] result = new int[res.size()];
for(int i=0;i<res.size();i++) {
result[i] = res.get(i);
}
return result;
}
2,map计数法:
public static int[] intersect2(int[] nums1, int[] nums2){
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Vector<Integer> res = new Vector<>();
for(int a : nums1) {
if(map.get(a) == null)
map.put(a, 1);
else
map.put(a, map.get(a) + 1);//计数
}
for(int a : nums2) {
if(map.get(a) != null && map.get(a) > 0) {
map.put(a, map.get(a) - 1);
res.add(a);
}
}
int[] result = new int[res.size()];
for(int i=0;i<res.size();i++) {
result[i] = res.get(i);
}
return result;
3,先排序(最快):
public static int[] intersect2(int[] nums1, int[] nums2){
Arrays.sort(nums1);//排序
Arrays.sort(nums2);
ArrayList result = new ArrayList();
for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ){
if (nums1[i] == nums2[j]){
result.add(nums1[i]);
i++;
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
int[] res = new int[result.size()];
for (int i = 0; i < result.size(); i++){
res[i] = (int) result.get(i);
}
return res;
}
四、python解决
1,先排序
lass Solution(object):
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
nums1, nums2 = sorted(nums1), sorted(nums2)
p1 = p2 = 0
ans = []
while p1 < len(nums1) and p2 < len(nums2):
if nums1[p1] < nums2[p2]:
p1 += 1
elif nums1[p1] > nums2[p2]:
p2 += 1
else:
ans += nums1[p1],
p1 += 1
p2 += 1
return ans
2,map计数,不过用的是Counter(很快)
这里同时回答了思考题2,3
class Solution(object):
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
c = collections.Counter(nums1)//计数
ans = []
for x in nums2:
if c[x] > 0:
ans += x,
c[x] -= 1
return ans