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

文章目录

  • 一、题目描述
  • 二、排序+指针
    • 1、解题思路
    • 2、具体代码
    • 3、知识点
  • 三、哈希表
    • 1、解题思路
    • 2、具体代码
    • 3、知识点
  • 四、总结

一、题目描述

给定两个数组,编写一个函数来计算它们的交集。例如:
输入: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流进行转换。

四、总结

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

你可能感兴趣的:(力扣题解,leetcode,java,排序算法)