二分查找349

134 阅读2分钟

题目描述

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

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]

说明:

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

解法(java版):

解题描述:

1、看结果中是不存在重复元素的,所以第一步要去重,自然地就想到了Set和Map(map的key重复会覆盖,但是因为没有value,所以用set),set中的元素(注意重写元素的equals和hashCode方法,否则会当成同一对象,Obejct.hashCode()的默认实现是为每一个对象生成不同的int数值,它本身是native,与内存地址有关)

public class Title349 {

    public int[] intersection(int[] nums1, int[] nums2) {
        if(null==nums1||null==nums2||nums1.length==0||nums2.length==0){
            return new int[0];
        }
        Set setNums1 = new HashSet<>();
        Set result = new HashSet();
        for (int value : nums1) {
            setNums1.add(value);
        }
        for (int value : nums2) {
             //set的底层是HashMap,map存储是数组+链表,找到数组的位置是O(1),在链表是顺序查找
            if (setNums1.contains(value)) {
                result.add(value);
            }
        }
        int[] res = new int[result.size()];
        int i=0;
        Iterator iterator = result.iterator();
        while (iterator.hasNext()) {
            res[i++]= (int) iterator.next();
        }
        return res;
    }

     public int[] intersectionMap(int[] nums1, int[] nums2) {
        if(null==nums1||null==nums2||nums1.length==0||nums2.length==0){
            return new int[0];
        }
        //注意初始化大小,否则会引起频繁扩容
        Map setNums1 = new HashMap();
        Map result = new HashMap();
        for (int value : nums1) {
            setNums1.put(value,null);
        }
        for (int value : nums2) {
            if (setNums1.containsKey(value)) {
                result.put(value,null);
            }
        }
        int[] res = new int[result.size()];
        int i=0;
        Iterator iterator = result.keySet().iterator();
        while (iterator.hasNext()) {
            res[i++]=  (int)iterator.next();
        }
        return res;
    }

    public static void main(String[] args) {
        int[] nums1={1,2,2,1};
        int[] nums2={2,2};
        //set
        int[] arr=new Title349().intersection(nums1,nums2);
        for(int value:arr){
            System.out.println(value);
        }

        int[] nums3={4,9,5};
        int[] nums4={9,4,9,8,4};
        //map
        int[] arr2=new Title349().intersectionMap(nums3,nums4);
        for(int value:arr2){
            System.out.println(value);
        }
    }

}

gain:

1、注意代码的书写

2、如果是数组都转成set的话,会进行多余的计算