《中英双解》leetCode Intersection of Two Arrays(两个数组的交集)

349. Intersection of Two Arrays

难度简单468收藏分享切换为中文接收动态反馈

Given two integer arrays nums1 and nums2, return an array of their intersection. Each element in the result must be unique and you may return the result in any order.

Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]

Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [9,4]
Explanation: [4,9] is also accepted.

Constraints:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

本题我最初的想法是采用双指针法,不过在做的时候碰到了一些问题:

第一:对于相同的数字我不知道如何替换掉

第二:数组总是越界异常

package Sort;

import java.util.Arrays;

public class IntersectionOfTwoArrays {
    public static int[] intersection(int[] nums1,int[] nums2){
        //采用排序+双指针的用法
        int length1 = nums1.length;
        int length2 = nums2.length;
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        //创建辅助数组
        int[] help = new int[length1+length2];
        //创建指针
        int index = 0,index1 = 0,index2 = 0;
        while(index1 < length1 && index2 < length2){
            int num1 = nums1[index1];
            int num2 = nums2[index2];
            if(num1 == num2){
                //去除相同情况
                if(index == 0 || num1 != help[index -1]){
                    help[index] = num1;
                    index++;
                }
                index1++;
                index2++;
            } else if(num1 < num2){
                index1++;
            } else {
                index2++;
            }
        }
        return Arrays.copyOfRange(help,0,index);
    }

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

 下面看另一种解法,使用集合

public static int[] intersectionAnother(int[] nums1,int[] nums2){
        Set<Integer> set = new HashSet<>();
        Set<Integer> intersection = new HashSet<>();
        for(int i = 0;i < nums1.length;i++){
            set.add(nums1[i]);
        }
        for(int j = 0;j < nums2.length;j++){
            if(set.contains(nums2[j])){
                intersection.add(nums2[j]);
            }
        }
        int i = 0;
        int[] result = new int[intersection.size()];
        for(Integer num : intersection){
            result[i++] = num;
        }
        return result;
    }
    public static void main(String[] args) {
        int[] nums1 = new int[]{1,2,2,1};
        int[] nums2 = new int[]{2,2};
        int[] result = intersection(nums1,nums2);
        int[] result2 = intersectionAnother(nums1,nums2);
        for(int i : result2){
            System.out.println(i);
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值