玩转lee 查找 349 两个数组的交集(不含重复)350 (含重复)

2 篇文章 0 订阅
1 篇文章 0 订阅

给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

思路 hashset

结果中每个元素唯一,想到hashset 中无重复元素
先用hashmap存数组1
再用hashset找map中和数组2 中都有的存入set中
然后遍历set,把他存入新数组中,返回。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        HashMap<Integer,Integer> map = new HashMap<>();
        HashSet<Integer> set=new HashSet<>();
        for(int i=0;i<nums1.length;i++){
            map.put(nums1[i],i);
        }
        for(int j=0;j<nums2.length;j++){
            if(map.containsKey(nums2[j])){
                set.add(nums2[j]);
            }
        }
        int [] res=new int[set.size()];
        Iterator iterator=set.iterator();
        int k=0;
        while(iterator.hasNext()){
            res[k++]=(int)iterator.next();
        }
        return res;  
    }
}

官方解

用TreeSet性能更好,存数组一
用arrayList比较set 存入,同时删掉包含的
建立新数组,吧ArrayList导入新数组返回

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        TreeSet<Integer> set =new TreeSet<>(); 
        for(int num:nums1)
            set.add(num);
        ArrayList<Integer> list =new ArrayList<>();//建立一个存放交集
        for(int num:nums2){
            if(set.contains(num)){
                list.add(num);
                set.remove(num); 
            }
                
        }
        int[] res= new int[list.size()];
        for(int i=0;i<list.size();i++)
            res[i]=list.get(i);
        return res;
    }
}

迭代器

        int [] res=new int[set.size()];
        Iterator iterator=set.iterator();
        int k=0;
        while(iterator.hasNext()){
            res[k++]=(int)iterator.next();
        }

迭代器(Iterator)

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

lee350(包含重复)

我的思考

用map存储数组1
将map 和数组2比较如果有,存入新res数组中,同时 map对应value减一,如果value=0,删除map中键值。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        
        HashMap<Integer,Integer> map=new HashMap<>();
        
        for(int i=0;i<nums1.length;i++){
            if(map.containsKey(nums1[i])){
                map.put(nums1[i],map.get(nums1[i])+1);
            }
            else
                map.put(nums1[i],1);
        }
        int[] res=new int[nums2.length];
        int m=0;
        for(int j=0;j<nums2.length;j++){
            
               if(map.containsKey(nums2[j])){
                   res[m++]=nums2[j];
                   map.put(nums2[j],map.get(nums2[j])-1);
                   if(map.get(nums2[j])==0)
                       map.remove(nums2[j]);
               } 
        }
        return res;
    }
}

输入:
[4,9,5]
[9,4,9,8,4]
输出
[9,4,0,0,0]
预期结果
[4,9]

这样做不知道最终数组有多少个数,没法定义长度,所以得出的结果不对,所以要**先存在动态数组ArrayList中,**然后把ArrayList导入res数组中返回。

正解:

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        
        HashMap<Integer,Integer> map=new HashMap<>();
        
        for(int i=0;i<nums1.length;i++){
            if(map.containsKey(nums1[i])){
                map.put(nums1[i],map.get(nums1[i])+1);
            }
            else
                map.put(nums1[i],1);
        }
       // int[] res=new int[nums2.length];
       // int m=0;
        ArrayList<Integer> list=new ArrayList<>();
        for(int j=0;j<nums2.length;j++){
            
               if(map.containsKey(nums2[j])){
                   list.add(nums2[j]);
                   map.put(nums2[j],map.get(nums2[j])-1);
                   if(map.get(nums2[j])==0)
                       map.remove(nums2[j]);
               } 
        }
        int [] res=new int[list.size()];
        for(int i=0;i<res.length;i++){
            res[i]=list.get(i);
        }
        return res;
    }
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值