前言
题目出自力扣
算法练习题:两个数组的交集2
一、题目
题目
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
测试用例
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
来源:力扣(LeetCode)
二、解答
1.代码
代码如下(示例):
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> n1 = getMap(nums1);
Map<Integer, Integer> n2 = getMap(nums2);
//先比较长度 选取比较短的就可减少比较次数
if (n1.size() < n2.size()) {
return getIntersection(n1, n2);
} else {
return getIntersection(n2, n1);
}
}
static Map getMap(int[] nums) {
// 写一个方法 用来把数组放到map里面
Map<Integer, Integer> n = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (n.containsKey(nums[i])) {
n.put(nums[i], n.get(nums[i]) + 1);
} else {
n.put(nums[i], 1);
}
}
return n;
}
static int[] getIntersection(Map<Integer, Integer> n1, Map<Integer, Integer> n2) {
// int[] key = new int[n1.size()];
// 用列表做一个可变长度的数组
List<Integer> list = new LinkedList<>();
for (int i : n1.keySet()) {
// 是否有相同的数字
if (n2.containsKey(i)) {
// 如果有比较出现的次数
if (n1.get(i).equals(n2.get(i))) {
//出现次数相同 直接加
list = getList(list, i, n1.get(i));
} else {
// 出现次数不同加少的那个
list = getList(list, i, Math.min(n1.get(i), n2.get(i)));
}
}
}
//将列表转换成数组并返回
return list.stream().mapToInt(Integer::valueOf).toArray();
}
static List getList(List<Integer> list, int num, int count) {
// 往列表里加东西 我也抽象成方法了
for (int i = 0; i < count; i++) {
list.add(num);
}
return list;
}
}
//leetcode submit region end(Prohibit modification and deletion)
/*效率不高 但是我喜欢这次写的代码
解答成功:
执行耗时:6 ms,击败了7.75% 的Java用户
内存消耗:41.6 MB,击败了28.15% 的Java用户
*/
2.复盘
这里用到了集合的概念,Map List,还有将List转化成数组的方法,实践出真实,稍后会整理一份Set和Map的详细讲解和使用方法 敬请期待。
总结
加油。