【面试经典150 | 哈希表】两数之和

news2024/11/19 4:47:36

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:暴力枚举
    • 方法二:哈希表
  • 写在最后

Tag

【哈希表】【数组】


题目来源

1. 两数之和


题目解读

给定一个下标从 1 开始按照 非递减顺序排列 的整数数组 numbers,找出两数之和等于 target 的两个数,返回它们的下标,其中每个整数只能使用一次,题目保证只有唯一的答案。


解题思路

本题属于基础题,与 167. 两数之和 II - 输入有序数组 解法基本一致。现在有三种解法如下。

方法一:暴力枚举

一个比较容易想到的方法就是枚举所有可能的两数组合,使用两层枚举,第一层枚举第一个整数,第二层枚举第二个整数。本题的数据量为 1 0 4 10^4 104,两层枚举的时间复杂度为 1 0 8 10^8 108,勉强可以通过。

具体地,在枚举中判断两数之和是否等于 target,如果相等,直接返回对应的下标。

因为每个元素只可以使用一次,并且两数先后出现的顺序没有要求,因此
第二层枚举的整数可以从第一层枚举的整数的后一个位置开始。

实现代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        int i, j;
        for( i = 0; i < n - 1; i ++) {
            for( j = i + 1; j < n; j ++) {
                if(nums[i] + nums[j] == target) {
                    return {i,j};
                }
            }
        }
        return {i,j};
    }
};

复杂度分析

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( 1 ) O(1) O(1)

方法二:哈希表

方法一中的时间复杂度可以优化到 O ( n ) O(n) O(n)

我们在枚举第二个整数的时候,可以事先用一个哈希表来记录下所有整数以及位置,这样枚举第二个整数的时间复杂度可以降为 O ( 1 ) O(1) O(1),但是需要一个额外的空间。

具体地,可以先一次遍历 numbers,记录每个整数以及下标;记录完毕后,枚举第一个加数,在哈希表中查找第二个加数;以上的过程可以用一个循环就可以解决:枚举第一个加数之后,先在哈希表中查询有么有合适的第二个加数,然后再将当前的加数放入哈希表中,这样可以省去一次 for 循环。

实现代码

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

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 numbers 的长度,只要一次循环就可以枚举两个加数。

空间复杂度: O ( n ) O(n) O(n),记录整数以及位置所用的空间。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

软件测试学习(五)

报告发现的问题 设法修复软件缺陷 ●没有足够的时间。在任何一个项目中&#xff0c;通常是软件功能太多&#xff0c;而代码编写人员和软件测试人员太少&#xff0c;而且进度中没有留出足够的空间来完成项目。假如你正在制作税务处理程序&#xff0c;4月15日 (赶在应付税务检查…

计算机毕业设计选什么题目好?springboot 高校学生综合测评管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

枚举探秘:Java中的神奇力量!

在 Java 枚举出现之前&#xff0c;通常会使用常量类来表示一组固定的常量值&#xff0c;直到Java 1.5之后推出了枚举&#xff0c;那么枚举类型有哪些特点&#xff0c;它比常量类又好在哪里呢。 本文将分析一下枚举的特点及用法。 一、什么是枚举 Java 枚举&#xff08;Enum&a…

leetcode 75. 颜色分类

2023.10.13 题目不让用sort方法&#xff0c;所以先用冒泡排序做了一下&#xff1a; 冒泡排序 class Solution {public void sortColors(int[] nums) {for(int i0; i<nums.length-1; i){for(int j0; j<nums.length-1; j){if(nums[j] > nums[j1]){int temp nums[j];n…

嵌入式实训室建设方案

嵌入式实训室概述 随着物联网和人工智能的快速发展,嵌入式技术迎来了发展机遇的同时,也给高校的嵌入式系统课程带来了挑战。嵌入式系统具有体积小、功能强、可靠性高等特点,已经广泛应用于各个领域,深入人们生活方方面面,对应培养多样化、高端化人才的需求。因此,越来越多高校…

信号弹图像立体匹配算法研究

目录 摘 要............................................. 3 第一章 绪论................................... 6 1.1 研究课题背景.......................... 6 1.2 立体匹配技术国内外发展现状............ 7 1.3 课题研究的目的...............…

代码随想录算法训练营第天十九天丨 二叉树part06

654.最大二叉树 思路 最大二叉树的构建过程如下&#xff1a; 对于这道题&#xff0c;思路整体模仿的是昨天的 根据中后序遍历构造二叉树 的解题思路。 直接看代码&#xff1a; class Solution {//用于快速查找private Map<Integer,Integer> map;public TreeNode cons…

3.6 空值的处理

思维导图&#xff1a; **3.6 空值的处理** 在前面的章节中&#xff0c;我们已经多次接触到了空值&#xff08;NULL&#xff09;的概念及其处理方式。在这一节中&#xff0c;我们将系统性地深入探讨空值的问题。 **定义&#xff1a;** 空值表示“不知道”、“不存在”或“无意…

云计算是什么?学习云计算能做什么工作?

很多人经常会问云计算是什么&#xff1f;云计算能干什么&#xff1f;学习云计算能做什么工作&#xff1f;其实我们有很多人并不知道云计算是什么&#xff0c;小知今天来给大家讲讲学习云计算能做什么。 中国的云计算行业目前正处于快速发展阶段&#xff0c;随着互联网和数字化…

介绍使用Photoshop制作ico图标

文章目录 说在前面安装制作插件制作ico 说在前面 Photoshop可以通过ICOFormat.8bi插件生成ico&#xff0c;但需要我们自行安装&#xff0c;安装过程很简单。 安装制作插件 下载地址&#xff1a; http://www.telegraphics.net/sw/ 下载完后解压文件得到下面这样的文件&#…

MySQL数据库的基本操作一

目录 什么是MySQL数据库? 数据库的基本操作 数据库操作 表操作 MySQL的增删改查 插入操作 查找操作 修改操作 删除操作 什么是MySQL数据库? MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;目前属于 Oracle 公司。MySQL 是一种关…

Zalo是什么?海外推广怎么做?

zalo是一款海外流行的通讯软件&#xff0c;2012年正式发布&#xff0c;至今已经拥有约2亿的用户&#xff0c;分别在越南、美国、缅甸、日本、台湾、泰国、韩国、马来西亚、沙乌地阿拉伯、安哥拉、斯里兰卡、捷克、俄罗斯地区上架。 zalo的越南用户数量很多&#xff0c;是越南地…

实操指南|如何用 OpenTiny Vue 组件库从 Vue 2 升级到 Vue 3

前言 根据 Vue 官网文档的说明&#xff0c;Vue2 的终止支持时间是 2023 年 12 月 31 日&#xff0c;这意味着从明年开始&#xff1a; Vue2 将不再更新和升级新版本&#xff0c;不再增加新特性&#xff0c;不再修复缺陷 虽然 Vue3 正式版本已经发布快3年了&#xff0c;但据我了…

c++视觉处理---直方图均衡化

直方图均衡化 直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分布图像的像素值&#xff0c;以使图像的直方图变得更均匀&#xff0c;从而提高图像的视觉质量。在OpenCV中&#xff0c;您可以使用 cv::equalizeHist 函数来执行直方图均衡化。以下是 cv::equal…

Xcode 14.3.1build 报错整理

1、Command PhaseScriptExecution failed with a nonzero exit code 2、In /Users/XX/XX/XX/fayuan-mediator-app-rn/ios/Pods/CocoaLibEvent/lib/libevent.a(buffer.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/XX/XX/XX/fayuan…

ASAN入门参考

目录 Asan 是什么&#xff1f; Asan 功能 缓冲区溢出 悬空指针&#xff08;引用&#xff09; 非法释放 内存泄漏 如何使用 实验环境 内存泄露检查 demo1 demo2 堆缓冲区溢出 栈缓冲区溢出 使用悬空指针 使用栈上返回的变量 使用退出作用域的变量/内存 重复释放…

逐字稿 | 对比学习论文综述【论文精读】

对比学习在计算机视觉领域的发展历程&#xff0c;4个阶段&#xff1a; 百花齐放&#xff1a;方法、模型、目标函数、代理任务都还没有统一。CV双雄&#xff1a;MOCOv1、SimCLRv1、MOCOv2、SimCLRv2、CPC和CMC的延伸工作、SwaV&#xff0c;这个阶段发展非常迅速&#xff0c;以上…

好莱坞编剧大罢工终于结束;与OpenAI创始人共进早餐;使用DALL-E 3制作绘本分享;生成式AI的基础设施架构 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 好莱坞编剧大罢工终于结束&#xff1a;简单说就是AI妥协了 https://www.wgacontract2023.org/the-campaign/summary-of-the-2023-wga-…

【Pytorch】深度学习之损失函数

文章目录 二分类交叉熵损失函数交叉熵损失函数L1损失函数MSE损失函数平滑L1(Smooth L1)损失函数目标泊松分布的负对数似然损失KL散度MarginRankingLoss多标签边界损失函数二分类损失函数多分类的折页损失三元组损失HingEmbeddingLoss余弦相似度CTC损失函数参考资料 学习目标&am…

CS配合frp上线

代理使用场景 1、拿下远程web服务器 2、webshell链接不稳定&#xff0c;需要使用稳定的木马程序 3、远程服务器无法直接链接攻击者电脑 4、需要借助公网vps转发来自失陷服务器的木马流量 5、借助frp服务端(vps)和客户端(内网攻击者)建立隧道 6、当vps某一个端口收到流量的…