( 哈希表) 1. 两数之和 ——【Leetcode每日一题】

news2025/1/12 20:05:00

哈希表使用 O ( N ) O(N) O(N) 空间复杂度存储数据,并且以 O ( 1 ) O(1) O(1) 时间复杂度求解问题。

❓1. 两数之和

难度:简单

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 < = n u m s . l e n g t h < = 1 0 4 2 <= nums.length <= 10^4 2<=nums.length<=104
  • − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 109<=nums[i]<=109
  • − 1 0 9 < = t a r g e t < = 1 0 9 -10^9 <= target <= 10^9 109<=target<=109
  • 只会存在一个有效答案

进阶: 你可以想出一个时间复杂度小于 O(n2) 的算法吗?

💡思路:

求两数之和可以先对数组进行排序,然后使用双指针方法或者二分查找方法。这样做的时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN),空间复杂度为 O ( 1 ) O(1) O(1)。但是该题目是返回数组下标,所以不能先排序!

法一:暴力枚举

最容易想到的方法是枚举数组中的每一个数 nums[i],寻找数组中是否存在 target - nums[i]

当我们使用遍历整个数组的方式寻找 target - nums[i] 时,需要注意到每一个位于 nums[i] 之前的元素都已经和 nums[i] 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 nums[i] 后面的元素中寻找 target - nums[i]

法二:哈希表

HashMap 存储数组元素和索引的映射: (使用空间来换取时间)

  • 在访问到 nums[i] 时,判断 HashMap 中是否存在target - nums[i]
  • 如果存在说明target - nums[i]所在的索引和 i 就是要找的两个数。
  • 如果不存在则将{nums[i], i}加入哈希表。

🍁代码:(Java、C++)

法一:暴力枚举
Java

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for(int i = 0;i<nums.length;i++){
			for(int j=i+1; j<nums.length;j++){
				if(nums[j] == target - nums[i]){
					return new int[]{i,j};
				}
			}
		}
		return null;
    }
}

法二:哈希表
Java

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

C++

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> indexForNum;
        for(int i = 0; i < nums.size(); i++){
            if(indexForNum.find(target - nums[i]) != indexForNum.end()){
                return {i, indexForNum[target - nums[i]]};
            }else{
                indexForNum.insert({nums[i], i});
            }
        }
        return {};
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 是数组中的元素数量。对于每一个元素 num[i],我们可以 O ( 1 ) O(1) O(1) 地寻找 target - num[i]。暴力求解时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( n ) O(n) O(n),其中 n 是数组中的元素数量,主要为哈希表的开销。暴力求解空间复杂度为 O ( 1 ) O(1) O(1)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

计算机网络【1】 TCP/IP

OSI七层模型与TCP/IP四层模型 首先简单说一下OSI参考模型&#xff0c;OSI将网络分为七层&#xff0c;自下而上分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xff0c;而TCP/IP体系结构则将网络分为四层&#xff0c;自下而上分别是网络接口层、网络层、…

如何冲破 GPT-4 的信息茧房?

由于大模型的成功经验&#xff0c;整个 AI 领域纷纷转向&#xff0c;要么是将模型架构换为 Transformer&#xff0c;要么是将小模型换为大模型&#xff0c;要么是将建模方式换为自监督、自回归范式等等。 GPT-4 推出后&#xff0c;各种 demo 充斥网络空间&#xff0c;写代码、…

论文投稿指南——如何让SCI论文英语更地道(细节掌握)

​ 学术论文英文写作都要符合ABC三个基本点&#xff1a;准确、简洁和清晰 (Accurate\Brief\Clear)&#xff0c;在此基础上做好必要的细节&#xff0c;可以让你的英文写作更地道化、学术化。以下建议可供各位小伙伴参考&#xff1a; 一、错误用法 ★ So/But/And/Also…等连接词…

如何判定自己适合自学编程还是报班?

首先在这里&#xff0c;不做偏向性推荐&#xff0c;主要还是看个人条件。 宝剑锋从磨砺出&#xff0c;学习本身是一件艰苦的事情。在决定之前&#xff0c;建议先按照下图问自己三个问题自我检测。 如果你还不能确定&#xff0c;自学和报班的优劣势分析&#xff0c;或许能帮你们…

Spring JDBC和事务控制

目录 Spring JDBC 和 事务控制主要内容Spring 整合 JDBC 环境构建项目添加依赖坐标添加 jdbc 配置文件编写 spring 配置文件配置数据源C3P0 数据源配置DBCP 数据源配置 模板类配置Spring JDBC 测试 &#xff08;入门&#xff09;创建指定数据库创建数据表使用 JUnit 测试JUnit …

面试题30天打卡-day14

1、线程的生命周期是什么&#xff0c;线程有几种状态&#xff0c;什么是上下文切换&#xff1f; 线程通常有五种状态&#xff1a;创建&#xff0c;就绪&#xff0c;运行、阻塞和死亡状态。 新建状态&#xff08;New&#xff09;&#xff1a;新创建了一个线程对象。就绪状态&am…

超赞的实用前端社区精选?

转载 作者&#xff1a;黑马程序员前端 链接&#xff1a;https://www.zhihu.com/question/39503897/answer/2998752442 社区精选 | 好的前端社区可以根据其特点和领域进行分类整理&#xff1a; 1. 问答社区 Stack Overflow&#xff08;https://stackoverflow.com/&#xf…

【一起撸个DL框架】3 前向传播

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 3 前向传播&#x1f95d;3.1 前情提要3.2 前向传播&#xff1a;递归的forward方法3.3 再添乘法节点&#xff1a;搭建函数y2x13.4 小结 3 前向传播&#x1f95d; 3.1 前情提要 上一篇…

vue - 实现对div的拖动功能

实现对div的拖动功能&#xff0c;需要先要知道以下的一些原生事件和方法&#xff1b; 1&#xff0c;事件: 方法描述onmousedown鼠标按钮被按下onmousemove鼠标被移动onmouseup鼠标按键被松开 2&#xff0c;方法: 方法描述event.clientX返回当事件被触发时鼠标指针相对于浏览…

基于elementplus 实现多级表格 最后一级展示图片

想要实现的效果 总共四级 前三级是表格 第四级使用图片展示&#xff1b; 看了一下官网 计划使用官网的树形结构&#xff0c; 但是发现并不能满足最后一个是图片形式的展示 最后利用了表格的expand&#xff1b; 在过程中主要需要解决的问题有&#xff1a;vue3 递归使用组件&am…

JavaScript题解2652.倍数求和|容斥原理

解题思路 在JavaScript中计算7/3*3&#xff0c;结果是7&#xff0c;而不是6。这是因为JavaScript中除法运算符&#xff08;/&#xff09;得到的结果是一个浮点数&#xff0c;而不是一个整数。 具体来说&#xff0c;7/3得到的结果是2.3333…&#xff0c;然后再乘以3得到7.0000…

辞了外包,上岸字节我落泪了,400多个日夜没人知道我付出了多少....

前言&#xff1a; 没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2023年3月&#xff0c;我有幸成为了字节跳动的一名自动化测试工程师&am…

nacos搭建

1、查询对应的nacos版本 在pom.xml文件中&#xff0c;按住ctrl单击 spring-cloud-alibaba-dependencies 跳转到对应的页面&#xff0c;搜索nacos 2、下载软件nacos 官网&#xff1a;https://nacos.io/zh-cn/ 地址 https://github.com/alibaba/nacos/releases 这里我们根据我…

【架构】如何在微服务下保证事务的一致性

文章目录 背景一、事务的介绍1.1 事务1.1.1 事务的产生1.1.2 事务的概念1.1.3 事务的特性1.1.4 Mysql隔离级别1.1.5 启动事务 1.2 本地事务1.2.1 本地事务定义1.2.2 本地事务的缺点 二、分布式事务定义三、分布式事务-强一致性解决方案3.1 二阶段提交协议3.2 三阶段提交协议 四…

centos7 nbd 挂在qcow2或qcow,raw,虚机镜像,virsh,virt,使用qemu-nbd挂载qcow2镜像文件

[rootlocalhost linux-3.10.63]# cat ../../../readme https://blog.51cto.com/mshxuyi/5857760 https://blog.csdn.net/weixin_42097108/article/details/111414501 错误解决 &#xff11;、nbd 模块未安装 登录后复制 [rootlocalhost ~]# modprobe nbd modprobe: FATAL…

ElasticJob-Lite 3.x 集成springBoot 实战 (一次性作业、定时作业)

文章目录 前言ElasticJob-Lite 3.x 集成springBoot 实战 (一次性作业、定时作业)1. ElasticJob简介2. ElasticJob-Lite 是什么3. 功能列表4. 所需依赖包5. 定时作业配置5.1. 作业:5.2. yml配置:5.3. 测试 6. 一次性任务配置、并手动触发6.1. 作业:6.2. yml配置:6.3. 测试 7. 其…

洞见数字时代的创新原力,数云原力大会暨2023TECH第五届数字中国技术年会开幕

4月25日&#xff0c;神州控股、神州信息、神州数码集团共同主办的数云原力大会暨2023TECH第五届数字中国技术年会开幕。开幕式上&#xff0c;数百位投身并关注数字技术、数字产业发展的学者、技术专家、从业者、行业用户齐聚一堂&#xff0c;围绕云原生、数字原生、大数据、金融…

2.龙芯2k1000 linux3.10内核编译过程

龙芯2k1000 linux3.10内核编译过程 文章目录 龙芯2k1000 linux3.10内核编译过程&#xff08;一&#xff09;、在Ubuntu环境下载并配置交叉编译链&#xff08;二&#xff09;、下载linux3.10内核源码&#xff08;三&#xff09;、使用menuconfig配置内核&#xff08;四&#xff…

【react从入门到精通】深入理解react生命周期这一篇就够了

文章目录 前言React的生命周期是什么React v16.0前的生命周期组件初始化(initialization)阶段组件挂载(Mounting)阶段组件更新(update)阶段组件销毁阶段 React v16.4 的生命周期总结写在最后 前言 在上一篇文章《react入门这一篇就够了》中我们已经掌握了React的基本知识。通过…

XXE原理利用防御

XXE原理利用防御 一、XML定义 1、定义 XML用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 2、原因 应用程序解析XML时&#xff0c;没有过滤外部实体的加载&#xff0…