【算法系列-哈希表】两数之和(Map)

news2024/11/25 2:26:35

【算法系列-哈希表】两数之和 (Map)

文章目录

  • 【算法系列-哈希表】两数之和 (Map)
    • 1. 两数之和(LeetCode 1, 梦开始的地方)
      • 1.1 思路分析🎯
      • 1.2 解题过程🎬
      • 1.3 代码示例🌰
    • 2. 四数相加II(LeetCode 454)
      • 2.1 思路分析🎯
      • 2.2 解题过程🎬
      • 2.3 代码示例🌰

1. 两数之和(LeetCode 1, 梦开始的地方)

【题目链接】1. 两数之和 - 力扣(LeetCode)

1.1 思路分析🎯

这道题使用哈希表中的map结构来解决问题,不过开始之前我们需要理清楚为什么要使用哈希表:

什么时候用哈希表:当我们需要判断一个元素之前是否出现过 或 一个元素是否存在于一个集合中时,可以使用哈希表;
这道题中我们需要哈希表来帮我们记录已经遍历过的元素;

为什么要使用map:这道题中我们返回的结果是元素在数组中的索引下标,对此可以使用map来进行映射,key存储元素,value存储索引下标

理清楚上述关系后就可以开始解题了

1.2 解题过程🎬

定义一个map,key存储元素,value存储索引下标 遍历数组:通过目标值target 减去当前数组下标元素 x1,得到数值x2,之后判断map中是否存在x2:

存在,则返回当前循环的索引值 i 以及 key = x2在map中的value值

不存在,则将当前数组下标元素x1 加入map中,继续循环

直到循环结束仍未返回,则返回空集合

1.3 代码示例🌰

class Solution {
    public int[] twoSum(int[] nums, int target) {
        
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0;i < nums.length;i++) {
            
            int x1 = nums[i];
            int x2 = target - x1;
            if (map.containsKey(x2)) {
                return new int[]{i, map.get(x2)};
            }
            map.put(x1, i);
        }
        return new int[2];
    }
}

2. 四数相加II(LeetCode 454)

【题目链接】454. 四数相加 II - 力扣(LeetCode)

2.1 思路分析🎯

这道题若用暴力解决的话,会直接**超时 O(n^4)**了,如下:

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int count = 0;
        for (int i = 0;i < nums1.length;i++) {
            for (int j = 0;j < nums2.length;j++) {
                for (int x = 0;x < nums3.length;x++) {
                    for (int y = 0;y < nums4.length;y++) {
                        if (nums1[i] + nums2[j] + nums3[x] + nums4[y] == 0) {
                            count++;
                        }
                    }
                }
            }
        }
        return count;
    }
}

在这里插入图片描述

所以使用哈希表来降低时间复杂度

2.2 解题过程🎬

定义 map 用来记录 数组1 和 数组2 遍历过的元素,key 为 两个数组元素每轮遍历元素之和,value 为两个数组元素之和出现的次数,之后分别执行下述操作:

  • 先对 数组 nums1 和 数组 nums2 进行遍历,设 a 为 nums1中元素, b 为 nums2 中元素,将 a + b 添加到map中;
  • 后对 数组 nums3 和 数组 nums4 进行遍历,设 c 为 nums3中元素, d 为 nums4 中元素,将 n = 0 - (c + d)添加到map中;若 n 在map中存在,则 count += map.get(n)

: 这里之所以是 0 - (c+ d) 是因为我们需要将这个元素和拿到map中去进行匹配,而 0 - (c + d) = (a + b) ); 这里是 + map.get(n) 而不是count++ 是因为 n 可以与 a + b 进行组合,所以要加上对应的次数

直到循环结束返回count即可

2.3 代码示例🌰

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        
        int count = 0;
        Map<Integer, Integer> map = new HashMap<>();
        
        for (int a : nums1) {
            for (int b : nums2) {
                map.put(x + y, map.getOrDefault(a + b, 0) + 1);
            }
        }
        for (int c : nums3) {
            for (int d : nums4) {
                int n = 0 - (c + d);
                if (map.containsKey(n)) {
                    count += map.get(n);
                }
            }
        }
        return count;
    }
}

以上便是对两数之和类问题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨

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

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

相关文章

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

rsync 数据镜像同步服务笔记

1. rsync概述 定义&#xff1a;rsync是一款数据镜像备份工具&#xff0c;支持快速完全备份和增量备份&#xff0c;支持本地复制与远程同步。镜像指两份完全相同的数据备份.特点&#xff1a; 支持整个目录树和文件系统的更新&#xff1b;可选择性地保留符号链接、文件属性、权限…

【Orange Pi 5嵌入式应用编程】-BMP280传感器驱动

BMP280传感器驱动 文章目录 BMP280传感器驱动1、BMP280传感器介绍2、BMP280的测量流程2.1 气压测量2.2 温度测量2.3 IIR滤波2.4 滤波器选择2.5 噪声3、BMP280的功耗模式3.1 休眠模式3.2 强制模式3.3 正常模式3.4 模式转换4、数据读取及计算4.1 寄存器数据覆盖4.2 输出补偿4.3 补…

一键生成证件照的开源利器:HivisionIDPhotos使用教程

HivisionIDPhotos使用教程&#xff1a;一键生成证件照的开源利器 HivisionIDPhotos 是一款开源的、轻量级且高效的AI工具&#xff0c;专注于证件照的自动生成。通过这一工具&#xff0c;用户只需上传一张自拍或其他照片&#xff0c;便能快速生成标准尺寸的证件照&#xff0c;免…

跟李沐学AI:Transformer

Transformer架构 (图源:10.7. Transformer — 动手学深度学习 2.0.0 documentation) 基于编码器-解码器架构来处理序列对 与使用注意力的seq2seq不同&#xff0c;Transformer纯基于注意力 多头注意力&#xff08;Multi-Head Attention&#xff09; (图源:10.5. 多头注意力 …

MyBatis环境配置详细过程

在此之前我们需要知道Maven和依赖是什么。 什么是Maven&#xff1f; Maven 是一个项目管理和构建自动化工具&#xff0c;最初由Apache软件基金会开发&#xff0c;主要用于Java项目的构建、依赖管理、文档生成和发布。Maven使用一种基于XML的配置文件&#xff08;pom.xml&…

vue后台管理系统从0到1(6)引入pinia实现折叠功能

文章目录 vue后台管理系统从0到1&#xff08;6&#xff09;引入pinia实现折叠功能分析&#xff1a;安装并使用 pinia vue后台管理系统从0到1&#xff08;6&#xff09;引入pinia实现折叠功能 分析&#xff1a; 首先&#xff0c;接着上一期&#xff0c;我们项目启动起来应该是…

【算法思想·二叉树】用「遍历」思维解题 II

本文参考labuladongsuanfa笔记[【强化练习】用「遍历」思维解题 II | labuladong 的算法笔记] 如果让你在二叉树中的某些节点上做文章&#xff0c;一般来说也可以直接用遍历的思维模式。 270. 最接近的二叉搜索树值 | 力扣 | LeetCode | 给你二叉搜索树的根节点 root 和一个目…

通信工程学习:什么是SDRAM同步动态随机存取存储器

SDRAM&#xff1a;同步动态随机存取存储器 SDRAM&#xff0c;全称为Synchronous Dynamic Random Access Memory&#xff0c;即同步动态随机存取存储器&#xff0c;是一种广泛应用于计算机和嵌入式系统中的内存技术。以下是对SDRAM的详细介绍&#xff1a; 一、SDRAM的定义与特点…

TimeGen3.2

一、安装 1.安装包下载 软件安装压缩包&#xff0c;点击链接下载&#xff0c;自取。 链接: https://pan.baidu.com/s/1kebJ2z8YPMhqyvDiHLKktw?pwd0000 提取码: 0000 二、解压安装 1.解压 2.安装软件 &#xff08;1&#xff09;双击timegen-pro-3.2.exe文件 &#xff…

[CTF夺旗赛] CTFshow Web13-14 详细过程保姆级教程~

前言 ​ CTFShow通常是指网络安全领域中的“Capture The Flag”(夺旗赛)展示工具或平台。这是一种用于分享、学习和展示信息安全竞赛中获取的信息、漏洞利用技巧以及解题思路的在线社区或软件。参与者会在比赛中收集“flag”&#xff0c;通常是隐藏在网络环境中的数据或密码形…

SHCTF-2024-week1-wp

文章目录 SHCTF 2024 week1 wpMisc[Week1]真真假假?遮遮掩掩![Week1]拜师之旅①[Week1]Rasterizing Traffic[Week1]有WiFi干嘛不用呢&#xff1f; web[Week1] 单身十八年的手速[Week1] MD5 Master[Week1] ez_gittt[Week1] jvav[Week1] poppopop[Week1] 蛐蛐?蛐蛐! SHCTF 2024…

一些自定义函数

目录 一.strcmp()函数 二.strstr()函数 三.memcpy函数 四.memmove函数 五.strncpy函数 六.strcat函数 七.atoi函数 八.strlen函数 一.strcmp()函数 strcmp 函数是用于比较两个字符串是否相等的函数。它通过逐个字符比较两个字符串的 ASCII 值&#xff0c;来判断它们的相…

QD1-P3 HTML 基础内容介绍

本节学习&#xff1a;HTML基础语法介绍。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p3 ‍ 一、运行HTML代码 在 HBuilderX编辑器中创建空项目&#xff0c;添加一个 html 文件 <!-- QD1-P3 HTML基础语法 --><!DOCTYPE html> <html><head>&l…

Java面试宝典-并发编程学习01

Java 并发编程学习 1、创建线程的有哪些方式&#xff1f; 创建线程的方式有以下几种&#xff1a; 1. 继承Thread类&#xff1a;创建一个类继承Thread类&#xff0c;并重写run()方法&#xff0c;然后通过创建类的实例来创建线程。 2. 实现Runnable接口&#xff1a;创建一个类实…

PH47框架下BBDB飞控基础开发平台极简教程

1 硬件准备 1.1 一块WeAct 的Stm32F411核心板 1.2 2个USB-TTL模块。 1.3 Stm32开发所必须的如STlink烧写器。 1.4 必要的线材。 2 软件准备 2.1 Stm32开发所必备的Keil开发环境。 2.2 PH47框架代码&#xff0c;下载链接 2.3 CSS及BBDB 控制站工程&#xff0c;下载链接 2.4…

鸿蒙面试的一些可能问到的点

页面跳转 router 鸿蒙中跳转主要有两种&#xff0c;一种是router&#xff0c;一种是Navigation&#xff0c;官方推荐使用Navigation。 Router适用于模块间与模块内页面切换&#xff0c;通过每个页面的url实现模块间解耦。模块内页面跳转时&#xff0c;为了实现更好的转场动效…

7.2-I2C的DMA中断

I2C的DMA中断 请先阅读完I2C的普通中断模式以后再阅读本教程 i2c的DMA模式 1.添加通道 &#xff0c;添加后的参数保持默认 2.可以看到自动给我们DMA添加了中断向量。 保存后只需要将下面_ IT改为_ DMA即可 运行代码 i2c1) { aht20State 4; } } /* USER CODE END 0 */ 以上就…

ssm基于java的网上手机销售系统

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框…

yolov5环境GPU搭建 ,用GPU跑polov5算法

win10NVIDIA GeForce RTX 3050torch1.13.1torchaudio0.13.1torchvision 0.14.1 cuda11.7python3.8cudnn8.7.0 在环境搭建中踩了许多坑&#xff0c;yolov5环境的搭建需要依赖很多环境&#xff0c;用cpu跑很容易跑单张识别&#xff0c;用GPU跑却踩了很多坑&#xff0c;不过GPU环…