• LeetCode 349. Intersection of Two Arrays


    Given two arrays, write a function to compute their intersection.

    Example:
    Given nums1 = [1, 2, 2, 1]nums2 = [2, 2], return [2].

    Note:

    • Each element in the result must be unique.
    • The result can be in any order.

    题意:给定两个数组,判断它们的交集。
    例:nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
    note:
    1. 返回的结果中每个元素都是唯一的,即不存在重复元素。
    2. 返回的结果中的元素顺序任意。

    思路1:使用两个set,一个set存放nums1中的元素,一个set存放交集。
    遍历nums1,将nums1中的元素存入set中;
    再遍历nums2,如果set中包含nums2[j],且result中还不包含nums2[j],则将nums2[j]存入result中。
    遍历result中的元素,逐个存入数组array中,返回array

    public int[] intersection(int[] nums1, int[] nums2) {
            Set<Integer> result = new HashSet<>();
            Set<Integer> set = new HashSet<>();
            for(int i = 0; i < nums1.length; i++){
                //if(!set.contains(nums1[i]))//如果此 set 中尚未包含指定元素,则添加指定元素。如果此 set 已包含该元素,则该调用不更改 set 并返回 false。
                    set.add(nums1[i]);//因此在调用set.add(nums1[i])方法之前,不用先判断是否存在nums1[i](!set.contains(nums1[i])
            }
            for(int j = 0; j < nums2.length; j++){
                if(set.contains(nums2[j])){
                    //if(!result.contains(nums2[j]))
                        result.add(nums2[j]);
                }
            }
            int[] array = new int[result.size()];
            int i = 0;
            for(int num : result){//将Set类型的result中的元素逐个存入数组,即将set转为数组
                array[i++] = num;
            }
            return array;
        }

    注:开始以为set存入元素时,一定要先判断是否已经存在该元素,如果不存在才能插入。看LeetCode中的答案时,发现并没有先判断set中是否存在该元素,而是直接存入。

    查看了set的api,发现set可以直接存入元素,而不必先判断该元素是否存在。

    HashSet中add方法的说明:

    如果此 set 中尚未包含指定元素,则添加指定元素。更确切地讲,如果此 set 没有包含满足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,则向此 set 添加指定的元素 e。如果此 set 已包含该元素,则该调用不更改 set 并返回 false

    LeetCode中提供的另外两个方法:

    思路2:先对nums1和nums2排序,用两个指针分别指向两个数组的起始元素,比较对应元素的大小。
    如果nums1[i] < nums2[j],则说明nums1的元素小,将nums1的指针加1;反之nums2的指针加1;
    如果nums1[i] = nums2[j],则说明该元素为交集,将nums1[i]存入set,同时让两个数组的指针都加1.

    public int[] intersection(int[] nums1, int[] nums2){
            Set<Integer> set = new HashSet<>();
            Arrays.sort(nums1);
            Arrays.sort(nums2);
            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{                    //nums1[i] = nums2[j]
                    set.add(nums1[i]);
                    i++;
                    j++;
                }
            }
            int k = 0;
            int[] nums = new int[set.size()];
            for(int num : set){
                nums[k++] = num;
            }
            return nums;
        }

    思路3:用二分法查找
    将一个数组排序,然后遍历另一个数组,把遍历到的每个数字在排序后的数组中用二分查找法搜索,如果能找到则放入结果set中

    public int[] intersection(int[] nums1, int[] nums2){
            Set<Integer> set = new HashSet<>();
            Arrays.sort(nums1);
            for(int i = 0; i < nums2.length; i++){
                if(binarySearch(nums1,nums2[i]))
                    set.add(nums2[i]);
            }
            int i = 0; 
            int[] nums= new int[set.size()];
            for(int num : set){
                nums[i++] = num;
            }
            return nums;
        }
        
        public boolean binarySearch(int[] nums, int target){
            int left = 0, right = nums.length - 1;
            while(left <= right){
                int mid = left + (right - left) / 2;
                if(nums[mid] == target)
                    return true;
                if(nums[mid] < target)
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            return false;
        }
  • 相关阅读:
    HTTP 常见状态码
    SpringMVC 入门
    Maven 整合SSH框架
    SSH 框架整合总结
    Maven 整合SSH框架之pom.xml
    Maven 入门
    WebService 综合案例
    CXF 框架
    jQuery高级
    JavaScript补充:BOM(浏览器对象模型)
  • 原文地址:https://www.cnblogs.com/zeroingToOne/p/8711496.html
Copyright © 2020-2023  润新知