350. 两个数组的交集 II

该博客介绍了如何利用哈希映射和排序两种方法解决寻找两个整数数组交集的问题。在哈希映射的解决方案中,首先遍历第一个数组并记录每个元素的出现次数,然后遍历第二个数组,根据哈希映射中的计数减少次数并将有效元素添加到结果列表。在排序的解决方案中,先对两个数组进行排序,然后使用双指针技术找到交集。这两种方法都考虑了数组大小和内存限制的影响,并在实际运行中取得了较好的性能。
摘要由CSDN通过智能技术生成

350. 两个数组的交集 II

难度简单446

给定两个数组,编写一个函数来计算它们的交集。

 

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

 

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
  • 我们可以不考虑输出结果的顺序。

进阶

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

 

思路见注释。

执行结果:

通过

显示详情

执行用时:3 ms, 在所有 Java 提交中击败了71.86%的用户

内存消耗:38.6 MB, 在所有 Java 提交中击败了66.91%的用户

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
            HashMap<Integer,Integer> count = new HashMap<>();
            List<Integer> res = new ArrayList<>();
            //读取第一个数组并计数
            for(int i=0;i<nums1.length;i++){
                if(count.containsKey(nums1[i])){
                    count.put(nums1[i],count.get(nums1[i])+1);
                }else{
                    count.put(nums1[i],1);
                }
            }
            //读取第二个数组进行相减,保持最少次数添加到res里面
            for(int i=0;i<nums2.length;i++){
                if(count.containsKey(nums2[i])){
                    int t=count.get(nums2[i]);
                    if(t>0){
                        //关键是验证t的大小,一旦当前计数等于0了,就已经达到最少次数了
                        t--;
                        count.put(nums2[i],t);
                        res.add(nums2[i]);
                    }
                }
            }
            

            int ans [] =new int[res.size()];
            for(int i=0;i<res.size();i++){
                ans[i]=res.get(i);
            }
            return ans;

    }
}
class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        //1.先排序再对比搜索两数组
            Arrays.sort(nums1);
            Arrays.sort(nums2);
            List<Integer> res = new ArrayList<>();
            int []t;
            if(nums1.length>nums2.length){
                t=nums1;
                nums1=nums2;
                nums2=t;
            }
            int i=0,j=0;
            while(i<nums1.length&&j<nums2.length){
                if(nums1[i]<nums2[j]){
                    i++;
                }else if(nums1[i]>nums2[j]){
                    j++;
                }else{
                    res.add(nums1[i]);
                    i++;
                    j++;
                }
            }

            int ans [] =new int[res.size()];
            for(i=0;i<res.size();i++){
                ans[i]=res.get(i);
            }
            return ans;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值