力扣题解:349、两个数组的交集(Java)

本文介绍了如何计算两个数组的交集,分别使用排序+指针和哈希表的方法。排序+指针通过双指针遍历并比较,哈希表则利用集合的特性快速查找。两种方法均给出了Java实现,并重点解析了关键步骤和知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

给定两个数组,编写一个函数来计算它们的交集。例如:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]

对于这个问题我想到了两种解法。

二、排序+指针

1、解题思路

(1)首先对两个数组进行排序,然后使用两个指针遍历两个数组。
(2)初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,且该数字不等于结果数组里面前一个元素,将该数字添加到答案,同时将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。

2、具体代码

public class Leet349 {
    public static void main(String[] args) {
        Leet349 test = new Leet349();
        int[] arr = test.intersection(new int[]{4,9,5},new int[]{9,4,9,8,4});
        System.out.println(Arrays.toString(arr));
    }
    public int[] intersection(int[] nums1, int[] nums2) {
        //1、先对nums1和nums2进行排序
        Arrays.sort(nums1);
        Arrays.sort(nums2);

        //2、创建两个指针,分别指向两个数组的首元素
        int index= 0,first = 0,second = 0;
        //3、创建数组ans保存结果
        int[] ans = new int[nums1.length+ nums2.length];

        while (first < nums1.length && second < nums2.length){
            if (nums1[first] == nums2[second]){
                //需要保证ans里面的元素不重复
                if (index == 0 || nums1[first] != nums1[first-1]){
                    ans[index++] = nums1[first];
                }
                first++;
                second++;
            }else if (nums1[first] < nums2[second]) {
                first++;
            }else {
                second++;
            }
        }
        //只返回ans数组里面的交集元素,其余元素不返回
        return Arrays.copyOfRange(ans,0,index);
    }
}

3、知识点

因为存放结果的ans数组初始化的长度是两个数组长度之和,所以ans数组后面会有很多0.我们需要用到copyOfrange这个方法只输出交集元素。copyOfRange(original,int from,int to)该方法是从original数组的下标from开始赋值,到下标to结束,不包括下标为to的元素。

三、哈希表

1、解题思路

1、创建两个HashSet:set和ans,set存放nums1的元素,ans存放交集。
2、将nums2的元素和set里面元素进行对比,把一样的元素存入ans
3、将HashSet类型转化为int[]类型

2、具体代码

import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

/*
349. 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
例如:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
 */
public class Leet349Hash {
    public static void main(String[] args) {
        Leet349Hash test = new Leet349Hash();
        int[] arr = test.intersection(new int[]{4,9,5},new int[]{9,4,9,8,4});
        System.out.println(Arrays.toString(arr));
    }
    public int[] intersection(int[] nums1, int[] nums2) {
        HashSet<Integer> set = new HashSet<>();//set存放nums1的元素
        HashSet<Integer> ans = new HashSet<>();//ans存放交集
        //把nums1中的元素添加到HashSet中
        for (int n:nums1){
            set.add(n);
        }
       //将nums2的元素和set里面元素进行对比,把一样的元素存入ans
        for (int m:nums2){
            if (set.contains(m)){
                ans.add(m);
            }
        }
        //将HashSet类型转化为int[]类型
        int[] arr = ans.stream().mapToInt(Integer::intValue).toArray();
        return arr;
    }
}

3、知识点

因为结果需要的返回值类型是int [],所以需要将HashSet类型转化为int[]类型。虽然Arrays工具类里面有个toArray()方法,但是返回的是Object[]类型,通常使用stream流进行转换。

四、总结

以上就是小赵同学对于这一问题的解法,如果代码有看不明白的地方,欢迎来找我交流讨论哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赵同学-

非常感谢你!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值