LeetCode 349.Intersection_of_TwoArrays

1、题目

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.


2、Java AC版:

算法思路:

1、使用Set保存结果,因为Set中是不会出现重复元素的!

2、遍历两个数组,当遇到相同元素时,把元素添加到集合中,如果集合中已经有该元素了,则不会重复添加。

3、把Set中的元素保存到int数组中返回

public static int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> returnVal = new HashSet<Integer>();
        int index = 0;

        for(int i = 0; i < nums1.length; i++){
            for(int j = 0; j < nums2.length; j ++){

                if(nums2[j] == nums1[i]){
                    //下面三行代码其实是不需要的,因为Set集合添加元素的时候是会有判断的。
//                        if(returnVal.contains(nums2[j])){
//                            continue;
//                        }
                    returnVal.add( nums2[j]);
                    }
                }
            }
            int[] a = new int[returnVal.size()];
            for(Integer item:returnVal){
                a[index] = item;
                index++;
            }
        return a;
    }

 3、Java AC版: 

算法思路:

1、对数组nums1和num2进行排序

2、遍历数组nums1和nums2中元素,并比较对应的元素

1)若相等,则添加元素到集合中(使用int数组保存返回值的需要先判断其值是否与结果中最后保存的元素相等),并把两个索引加1;

2)若不相等,则变化较小元素对应的索引即可。

public static int[] intersection2(int[] nums1, int[] nums2){
        // 1、对数组nums1进行排序
        //2、遍历数组nums1和nums2中元素,并比较对应的元素
            // 若相等,则判断其值是否与结果中最后保存的元素是否相等,相等则直接变化两个索引,否则将该值保存到结果中,并变化两个索引
            // 不等,则变化较小元素对应的索引即可。
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        Set<Integer> returnVal = new HashSet<Integer>();
        int index = 0;

        for(int i =0,j=0;i<nums1.length&j<nums2.length;){
            if(nums1[i] == nums2[j]){
                returnVal.add(nums1[i]);
                i++;
                j++;
            }else if(nums1[i] <nums2[j]){
                i++;
            }else{
                j++;
            }
        }
        int[] result = new int[returnVal.size()];
        for(Integer i : returnVal){
            result[index] = i;
            index++;
        }
        return result;
    }

 

3、Java AC版:

算法思路:

1、使用哈希Set存储两个数组

2、选择Set1遍历,如果Set1的元素在Set2中出现,那么就是交集(与此同时,因为只能返回一个值,所以出现后还需要从Set中删除哦)

 public static int[] intersection3(int[] nums1, int[] nums2){
        // 1、使用哈希Set存入第一个数组的值
        // 2、遍历第二个数组,如果第二个的数在Set中出现,那么就是交集(与此同时,因为只能返回一个值,所以出现后还需要从Set中删除哦)

        Set<Integer> set1 = new HashSet<Integer>();
        Set<Integer> set2 = new HashSet<Integer>();
        for(int i = 0;i < nums1.length;i++){
            set1.add(nums1[i]);
        }
        for(int i = 0;i < nums2.length;i++){
            set2.add(nums2[i]);
        }

        Set<Integer> returnVal = new HashSet<Integer>();
        for(Integer item:set1){
            if(set2.contains(item)){
                returnVal.add(item);
                /*
                因为两个集合中都没有重复元素,所以其实没必要做删除操作。
                但如果数组2中的元素没有用集合保存,则一次添加操作之后必须把该元素从SET1中删除。
                 */
//                set2.remove(item);
            }
        }

        int[] result = new int[returnVal.size()];
        int index = 0;
        for(Integer i : returnVal){
            result[index] = i;
            index++;
        }
        return result;
    }




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值