leetcode_350(求两个数组的交集)
来源:互联网 发布:js判断元素显示隐藏 编辑:程序博客网 时间:2024/06/08 17:26
一,题目大意
给定两个数组,编写函数计算它们的交集。
注意:
结果中的每个元素的出现次数应与其在两个数组中同时出现的次数一样多。
结果可以采用任意顺序。
进一步思考:
如果数组已经排好序,怎样优化你的算法?
如果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
0 0
- leetcode_350(求两个数组的交集)
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组交集
- 如何求两个数组的交集
- c#中求两个数组的交集
- android autolayout适配
- 写入字符到文件:java
- 不可靠信号问题
- bzoj 1601: [Usaco2008 Oct]灌水
- 【笔记】通讯录使用侧栏字母索引
- leetcode_350(求两个数组的交集)
- [Java面试九]脚本语言知识总结.
- git基础问题汇总
- C语言-统计二进制数中1的个数-Hamming weight-汉明权重问题
- 错误:HttpServlet was not found on the Java
- [Java面试十]浏览器跨域问题.
- eclipse创建maven工程出错了
- ffmpeg之AVInputFormat结构体
- 16 - 12 - 11 HDU 2117 ---Just a Numble