求两个集合的交集

 /**
     * 求两个集合的交集(即两个集合都共有的)
     * */
    //一般法   最简单、粗暴的循环遍历2个集合,判断如果有相同的元素就取出来。假设集合1的长度为M,集合2的长度为N,那么,时间复杂度为:O(M*N)
    public static List<String> GetIntersection(List<String> list1, List<String> list2) {
        List<String> list3 = new ArrayList<String>();
        for (String str1 : list1) {
            for (String str2 : list2) {
                if (str1.equals(str2))
                    list3.add(str1);
            }
        }
        return list3;
    }
    //最优法   利用hash这种很有用的数据结构来实现。我们知道,hash的特点之一就是不允许有重复元素,即hash表中的元素都是唯一的。所以,我们的思路就是:先把第一个集合的所有元素都放进hashSet中,时间复杂度O(M);再把第二个集合中的元素放进hashSet中,如果有重复元素,就是这2个集合的交集,时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。
    public static List<String> GetIntersection2(List<String> list1, List<String> list2) {
        List<String> list3 = new ArrayList<String>();
        HashSet<String> hashSet = new HashSet<String>();
        for (String item : list1) {
            hashSet.add(item);
        }
        for (String item : list2) {
            if (hashSet.add(item) == false) {
                list3.add(item);
            }
        }
        return list3;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值