首页 > 其他分享 >349. 两个数组的交集

349. 两个数组的交集

时间:2023-12-18 18:27:07浏览次数:40  
标签:set 交集 nums1 int result 数组 new 349 nums2

题目

349. 两个数组的交集

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

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

要求

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

思路

这道题目脑海中的第一个印象就是暴力破解,使用双层 for 循环或者是分开遍历,用 Set 保存,用 contains 方法,代码如下:

public int[] intersection(int[] nums1, int[] nums2) {
    Set<Integer> set1 = new HashSet<>();
    for (int i : nums1) {
        set1.add(i);
    }
    Set<Integer> set2 = new HashSet<>();
    for (int i : nums2) {
        set2.add(i);
    }
    Set<Integer> set = new HashSet<>();
    for (Integer i : set1) {
        if (set2.contains(i)) {
            set.add(i);
        }
    }
    int[] result = new int[set.size()];
    int index = 0;
    for (Integer num : set) {
        result[index ++] = num;
    }
    return result;
}

题目要求无序,那还可以排序 + 双指针的思路,两个数组都排下序,然后两个指针 + while 循环,代码如下:

/**
 * 排序 + 双指针
 * @param nums1
 * @param nums2
 * @return
 */
public int[] intersection(int[] nums1, int[] nums2) {
    // 排序 + 双指针看看
    Arrays.sort(nums1);
    Arrays.sort(nums2);
    Set<Integer> set = new HashSet<>();
    int nums1Point = 0;
    int nums2Point = 0;
    while (nums1Point < nums1.length && nums2Point < nums2.length) {
        if (nums1[nums1Point] == nums2[nums2Point]) {
            set.add(nums1[nums1Point]);
            nums1Point ++;
            nums2Point ++;
        } else if (nums1[nums1Point] > nums2[nums2Point]){
            nums2Point ++;
        } else {
            nums1Point ++;
        }
    }
    int[] result = new int[set.size()];
    int index = 0;
    for (Integer num : set) {
        result[index ++] = num;
    }
    return result;
}

第三个方法和之前的字母异位次类似,因为题目说了数组中的元素最大为 1000,包括 0 那就是 1001 个不同的数字,那我直接声明 1001 大小的数组,然后分开遍历,第一遍,给存在的元素索引 + 1,遍历第二个,判断索引位是否为 1,如果是则保存,并重置为 0,为了防止重复计算,代码如下:

/**
 * 根据提示来做,数组最长为 1000,那我声明一个 1001 大小的数组
 * @param nums1
 * @param nums2
 * @return
 */
public int[] intersection(int[] nums1, int[] nums2) {
    // 排序 + 双指针看看
    int[] arr = new int[1001];
    for (int i : nums1) {
        arr[i] = 1;
    }
    int index = 0;
    int[] result = new int[Math.max(nums1.length, nums2.length)];
    for (int i : nums2) {
        if (arr[i] == 1) {
            result[index ++] = i;
            // 重置的思路好呀
            arr[i] = 0;
        }
    }
    return Arrays.copyOfRange(result, 0, index);
}

标签:set,交集,nums1,int,result,数组,new,349,nums2
From: https://www.cnblogs.com/wadmwz/p/17911857.html

相关文章

  • Java 数组和ArrayList排序
    数组排序1.数组排序(从小到大排序)importjava.util.Arrays;publicclassTest01{publicstaticvoidmain(String[]args){//数组(从小到大排序)//1.第一种方法Integer[]arr1={21,11,41,31,51};Arrays.sort(arr1);Sy......
  • Array数组常用方法
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><script>vararr=[1,2,3,4]......
  • java基础知识点之一维数组的两个常见小问题
    一:概述在一维数组的使用中,一不小心就会出现错误,尤其是在初学的情况下。在这里我要说明的是两个常见的问题索引越界问题和空指针异常的问题。二:具体说明<1>索引越界问题初学者打眼一看,可能认为这没有错误,但运行之后,程序报错了。这个错误,一不小心就会犯。因为有时候我们会惯性思维的......
  • python 浮点数 round 舍一法 向零取整 df 数组 Series 三种数据类型实现
    介绍:python的round函数,默认进行四舍五入,我需要将3.45保留一位小数,3.4 一、一般格式使用Python的内置函数 math.floor() 来向下取整到指定的小数位数。例如,如果你想保留小数点后一位并向下取整,可以这样做:importmathnum=3.45rounded_num=math.floor(num*10)/......
  • 数组去重
    functionarrayNonRepeatfy(arr){letmap=newMap();letarray=newArray();//数组用于返回结果for(leti=0;i<arr.length;i++){if(map.has(arr[i])){//如果有该key值map.set(arr[i],true);}else{map.set(arr[i],......
  • 非动态数组版本下的筛选
    问题:一对多查找(筛选)的结果需要横向排列,但是表格暂时不支持动态数组。右拉下拉公式解决:{=IFERROR(INDEX(FILTER($E:$E,$D:$D=$G2),COLUMN(A1)),"")}公式中的Filter部分筛选出满总D列中等产于G2对应E列的内容,其结果是多个单元格组成的数组。使用Index提取数组中的内容,第......
  • 交换两个数组里的字符
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<Windows.h>intmain(){ chararr1[]="################################"; chararr2[]="GuoZhanJunnuJnshZouG"; intsz=sizeof(arr1)/sizeof(arr1......
  • 列队中对询问离线排序后如何建立树状数组
    假设\(m=5\)(注意值存储前\(m-1\)个人)注意我们并没有在方框里面填上具体编号,因为从下文就可以知道这是无关紧要的假设我们删除了第二个人绿色方框是新进来的一个人,红色斜杠表示被删除掉的(但是在代码中我们不会真正的删除这一个位置)那么如果要删除这行中的第二个人,等价于删除......
  • 学C笔记归纳 第十五篇——二维数组
    //二维数组创建intarr[3][3];chararr[5][10];doublearr[2][4];//二维数组初始化intarr[3][4]={1,2,3,4,5};//{1234}{5000}{0000}intarr[3][4]={{1,2},{4,5}};//{1200}{4500}{0000}intarr[][4]={{2,3},{4,5}};......
  • Matlab 用sort函数排序 二维数组
    在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可,如果排序后还需要保留原来的索引可以用返回值,即[B,ind]=sort(A),计算后,B是A排序后的向量,A保持不变,ind是B中每一项对应于A中项的索引。排序是按升序进行的。 由于在sort函......