算法训练——day15数组交集(是否去重)

news2024/11/13 18:57:35

349. 两个数组的交集

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

示例 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中的在哈希中是否存在,若存在则放入结果ret中。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1==null||nums2==null||nums1.length==0||nums2.length==0){
            return new int[0];
        }
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> ret = new HashSet<>();
        //遍历nums1
        for(int num:nums1){
            set1.add(num);
        }
        //遍历nums2.判断哈希表中是否存在
        for(int num:nums2){
            if(set1.contains(num)){
                ret.add(num);
            }
        }
        //数组
        int[] retArr = new int[ret.size()];
        int i = 0;
        for(int num:ret){
            retArr[i++]=num;
        }
        return retArr;
    }
}

由于题目中限制了数组长度,所以提前开好长度可以节省时间,再用数组模拟来节省空间,如果用哈希的话就是用空间换时间。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int []hash=new int[1001];
        int []tmp=new int[1001];
        int count=0;
        for(int i=0;i<nums1.length;i++){
            hash[nums1[i]]=1;
        }
        for(int j=0;j<nums2.length;j++){
            if(hash[nums2[j]]==1){
                tmp[count++]=nums2[j];
                hash[nums2[j]]++;
            }
        }
        int []ret=new int[count];
        for(int k=0;k<count;k++){
            ret[k]=tmp[k];
        }
        return ret;
    }
}


350. 两个数组的交集 II

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

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

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

提示:

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

进阶

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

和前面那题的区别就是,这个题要考虑重复数字问题。首先想到的就是哈希表了,进行记录。具体解释在代码中一注释。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        HashMap<Integer, Integer> map = new HashMap<>();
        ArrayList<Integer> list = new ArrayList<>();

        // 对nums1的数组遍历,存到map里面,key是数组元素值(对应map中的下标),value是出现次数
        for (int num : nums1) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        // 接着遍历nums2,如果上一轮中的value不为0,则进行结果存储并对该值进行减1操作
        for (int num : nums2) {
            if (map.getOrDefault(num, 0) > 0) {
                list.add(num);
                map.put(num, map.get(num) - 1);
            }
        }

        //转数组
        int[] ret = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            ret[i] = list.get(i);
        }
        return ret;
    }
}

 

在空间上还可以进行优化,我们可以保证map的大小是最小的数组的长度 ,加一个判断即可。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        if(nums1.length>nums2.length){
            return intersect(nums2,nums1);
        }
        HashMap<Integer, Integer> map = new HashMap<>();
        ArrayList<Integer> list = new ArrayList<>();

        // 对nums1的数组遍历,存到map里面,key是数组元素值(对应map中的下标),value是出现次数
        for (int num : nums1) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        // 接着遍历nums2,如果上一轮中的value不为0,则进行结果存储并对该值进行减1操作
        for (int num : nums2) {
            if (map.getOrDefault(num, 0) > 0) {
                list.add(num);
                map.put(num, map.get(num) - 1);
            }
        }

        //转数组
        int[] ret = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            ret[i] = list.get(i);
        }
        return ret;
    }
}

 用时间换空间,进行双层遍历(不实用)

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums2.length; j++) {
                if (nums1[i] == nums2[j]){
                    list.add(nums1[i]);
                    nums2[j] = -1;
                    break;
                }
            }
        }
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }
}

 空间换时间,已知数组长度最大为1000,所以开1001长度的数组。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int[] flag = new int[1001];//作为先遍历的标记数组
        for (int num : nums1) {
            flag[num]++;
        }

        int[] tmp = new int[1001];//中间数组,暂时存储
        int length = 0;//记录长度
        for (int num : nums2) {
            if (flag[num] > 0) {
                tmp[length++] = num;
                flag[num]--;
            }
        }
        //去掉多余的0
        int[] ret = new int[length];
        System.arraycopy(tmp, 0, ret, 0, length);
        return ret;
    }
}

 

yeah!完结! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI逻辑推理入门

参考数据鲸 (linklearner.com) 1. 跑通baseline 报名 申领大模型API 模型服务灵积-API-KEY管理 (aliyun.com) 跑通代码 在anaconda新建名为“LLM”的环境,并安装好相应包后,在jupyter notebook上运行baseline01.ipynb 2. 赛题解读 一般情况下,拿到一个赛题之后,我们需…

Python酷库之旅-第三方库Pandas(121)

目录 一、用法精讲 536、pandas.DataFrame.set_axis方法 536-1、语法 536-2、参数 536-3、功能 536-4、返回值 536-5、说明 536-6、用法 536-6-1、数据准备 536-6-2、代码示例 536-6-3、结果输出 537、pandas.DataFrame.set_index方法 537-1、语法 537-2、参数 …

Games101图形学笔记——着色

Shading Z-buffering&#xff08;深度缓冲&#xff09; Shading&#xff08;着色&#xff09;画家算法Z-BufferShading(着色&#xff09;Blinn-Phong Reflectance Model&#xff08;布林冯反射模型&#xff09;漫反射能量守恒 着色高光Blinn-Phong Reflection ModelShadingFreq…

Cpp输出多字符常量警告

Cpp输出多字符常量警告 Cpp中用单引号(single quotes)表示单个字符(single character)&#xff0c;例如a&#xff0c;$&#xff0c;用双引号(double quotes)表示字符串文本(text)&#xff0c;例如"Hello World! " 当在一个单引号里面存在多个字符时&#xff0c;Cpp…

怎么增加音频的音量?这几种方法可以轻松增加音频的音量!

怎么增加音频的音量&#xff1f;在日常生活的纷繁场景中&#xff0c;音频音量偏低的问题往往悄然成为我们不可忽视的困扰&#xff0c;它虽非重大难题&#xff0c;却能在关键时刻带来诸多不便与挑战&#xff0c;设想一下&#xff0c;在喧嚣的街头或拥挤的咖啡馆里&#xff0c;微…

ES分词导致查询结果不准确

问题现象 索引里面有数据&#xff0c;而没有查询出来。 如下图所示&#xff0c;术语库&#xff08;索引&#xff09;中里面有一条数据的原文是“层”&#xff0c;而根据完整的原文来查询该原文中的术语&#xff0c;并未将该术语查询出来。 根据原文查询该原文中的术语&#x…

FreeRTOS学习——接口宏portmacro.h

FreeRTOS学习——接口宏portmacro.h&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 portmacro版本&#xff1a;GCC/ARM_CM7 portmacro.h是什么 portmacro.h头文件&#xff0c;用于定义与特定硬件平台相关的数据类型和常量。 在移植过程中&#xff0c;…

VulhubDC-4靶机详解

项目地址 https://download.vulnhub.com/dc/DC-4.zip实验过程 将下载好的靶机导入到VMware中&#xff0c;设置网络模式为NAT模式&#xff0c;然后开启靶机虚拟机 使用nmap进行主机发现&#xff0c;获取靶机IP地址 nmap 192.168.47.1-254根据对比可知DC-4的一个ip地址为192.1…

无人机光电吊舱的技术!!

1. 成像技术 可见光成像&#xff1a;通过高分辨率相机捕捉地面或空中目标的清晰图像&#xff0c;提供直观的视觉信息。 红外热成像&#xff1a;利用红外辐射探测目标的温度分布&#xff0c;实现夜间或恶劣天气条件下的隐蔽目标发现。 多光谱成像&#xff1a;通过不同波段的光…

日用百货小程序如何渠道经营开店

将货更多的卖出去是每位商家的心声&#xff0c;日用百货商家手中的货具备多样性&#xff0c;挑选的用户也多&#xff0c;由于货单价较低&#xff0c;因此不断获客并其多买/复购/留存/裂变等是长期发展的关键点。 如何获得更多经营渠道&#xff0c;线上找寻出路是方法之一&…

ROS和ROS2借助智能大模型的学习和研究方法

机器人相关知识的本身和价值-CSDN博客 知识本身在智能时代毫无价值&#xff0c;需要基于知识应用和创新才有价值。 学历报废并非来自扩招&#xff0c;而是智能模型的快速发展。-CSDN blink-领先的开发者技术社区 2024年中秋&#xff0c;智能模型实力已经如此&#xff0c;但还…

智算筑基,九章云极DataCanvas公司闪耀2024年服贸会

9月12日&#xff0c;2024年中国国际服务贸易交易会&#xff08;以下简称“服贸会”&#xff09;在北京隆重开幕&#xff0c;九章云极DataCanvas公司携AI智算产品系列深度参展本届服贸会&#xff0c;为观众奉上技术与应用深度融合的参展盛宴。 本届服贸会由中华人民共和国商务部…

文心一言 VS 讯飞星火 VS chatgpt (349)-- 算法导论23.2 8题

八、Borden教授提出了一个新的分治算法来计算最小生成树。该算法的原理如下:给定图 G ( V , E ) G(V,E) G(V,E)&#xff0c;将 V V V划分为两个集合 V 1 V_1 V1​和 V 2 V_2 V2​&#xff0c;使得 ∣ V 1 ∣ |V_1| ∣V1​∣和 ∣ V 2 ∣ |V_2| ∣V2​∣的差最多为1。设 E 1 E_…

2.使用 VSCode 过程中的英语积累 - Edit 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

【每日刷题】Day124

【每日刷题】Day124 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 079. 子集 - 力扣&#xff08;LeetCode&#xff09; 2. 1863. 找出所有子集的异或总和再求和 …

超详细超实用!!!零基础java开发之云风笔记接口开发之删除笔记(十一)

云风网 云风笔记 云风知识库 一、service/NoteApi新增delNode接口定义 public interface NoteApi {...int deleteNote(NoteManage noteManage); }二、service/impl/NoteServiceImpl接口实现逻辑 public class NoteServiceImpl implements NoteApi {AutowiredNoteMapper note…

LVM硬盘挂载

LVM硬盘挂载 一、基础概念 sda/sdb/nvme0n1/nvme0n2&#xff1a; 硬盘的命名方式&#xff0c;中括号的字母为第三位按不同硬盘的加载顺序排序。sda1/sda2/sdb1&#xff1a; 第4位为分区号&#xff0c;数字为不同分区的依序命名lvm: LVM是一种逻辑卷管理器&#xff0c;允许管理…

springboot实战学习笔记(2)

目录 1、手动创建springboot工程&#xff0c;选择Maven构建。 2、Maven生成的&#xff0c;可能需要再main目录下new一个resources目录&#xff0c;再在其下目录new一个配置文件。 3、 pom文件中让当前的工程继承父工程依赖&#xff1a;、删去无用依赖。 4、引入后端环境所需要的…

STL,智能指针和线程安全,线程安全的单例模式和懒汉饿汉的实现,以及读者写者问题

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;STL&#xff0c;智能指针和线程安全 &#x1f4d5;STL中的容器是否是线程安全的?&#x1f4a1;智能指针是否是线程安全…

【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念&#xff1a;函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…