美文网首页LeetCode笔记
【LeetCode】两个数组的交集

【LeetCode】两个数组的交集

作者: 幽泉流霜 | 来源:发表于2019-10-24 21:54 被阅读0次

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

    题目1#

    示例 1:

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

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

    输出结果中的每个元素一定是唯一的。
    我们可以不考虑输出结果的顺序。

    题目2#

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

    示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

    两题的区别在于一个不保留原数组出现的次数,另一个则保留
    对于第一次我们可以使用HashSet ,HashSet可以自动帮你去重
    第二个则使用HashMap ,用Map中的value来记录数字书出现的次数。

    题目1##

    因为函数的入口是两个int数组类型的
    所以我们索性写一个Set入口的函数
    然后把int仿佛Set后调用自写的Set函数
    最后返回一个int数组即可
    要注意的一点是set的长度和最后要返回的交集数组的长度不一致
    所以要调用Array的copyOf的方法

    package LeetCode_test;
    
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Intersection {
        public static void main(String[] args) {
    
        }
        public static int[] Prepare_intersection(Set<Integer> num1, Set<Integer> num2) {
            int[] output =new int[num1.size()];
            int m = 0 ;
    
            for(Integer i :num1){
                if(num2.contains(i)){
                    output[m++] = i;
                }//在num1种循环 如果num2中存在这个数则把这个数字加入到交集数组output的中
            }
            return Arrays.copyOf(output,m);
        }
        public static int[] intersection(int[] nums1, int[] nums2) {
            Set<Integer> num1 = new HashSet<>(nums1.length);
            for(int i :nums1){
                num1.add(i);//放入Set1
            }
            Set<Integer> num2 = new HashSet<>(nums2.length);
            for(int i : nums2){
                num2.add(i);//放入Set2
            }
            return Prepare_intersection(num2,num1);
        }
    }
    
    

    题目2##

    思路:
    分别设立一个HashMap和ArrayList
    将数组1 放入到HashMap中
    有几个数组则它的value就是几
    把数组2在HashMap中遍历
    如果存在数组2中的值则把它加入到list中
    并且将value减一 一旦减到0就说明数组一中也不包含这个数了
    所以在map中删除

    ps:这里我曾经的想法是判断map中value大小
    跟从小的那个。但是这样子会非常麻烦。
    题解中直接用了减法 也就是说只用了一个value
    这种减法对比 而不是仅仅通过正面条件的判断值得学习。

    package LeetCode_test;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class InsectionII {
        public static void main(String[] args) {
    
        }
        public static int[] intersect(int[] nums1, int[] nums2) {
            HashMap<Integer,Integer> Hm = new HashMap<>();
            List<Integer> lt = new ArrayList<>();
            for(int i:nums1){
                if(!Hm.containsKey(i)){
                    Hm.put(i,1);
                }//如果不存在key则加入到map中
                else  Hm.put(i,Hm.get(i)+1);
            }//如果存在就把它的value+1
            for(int i : nums2){
                if(Hm.containsKey(i)){
                    lt.add(i);
                    Hm.put(i,Hm.get(i)-1);
                    if(Hm.get(i) == 0 ){
                        Hm.remove(i);
                    }//map中包含了这个数就加入到list中 通过value来判断是否继续加入到map中
                }
            }
    //list中的即为最后返回的数组
            int[] res = new int[lt.size()];
            for(int i = 0 ; i<res.length;i++){
                res[i] = lt.get(i);
            }
            return res;
        }
    }
    
    

    相关文章

      网友评论

        本文标题:【LeetCode】两个数组的交集

        本文链接:https://www.haomeiwen.com/subject/dtvquctx.html