leetcode 面试经典 150 题:两数之和

server/2025/1/13 8:05:25/
链接两数之和
题序号1
题型数组
解题方法1. 哈希表,2. 暴力法
难度简单
熟练度✅✅✅✅✅

题目

  • 给定一个整数数组 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 <= nums.length <= 104
    -109 <= nums[i] <= 109
    -109 <= target <= 109
    只会存在一个有效答案

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

题解

  1. 核心思想

    • 使用一个哈希表来存储数组元素及其对应的下标。键是数组元素,值是元素的下标。
    • 遍历数组,对于每个元素 nums[i],计算 complement = target - nums[i]。
    • 检查 complement 是否在哈希表中。如果在,说明找到了两个数,它们的和为 target,直接返回它们的下标;如果不在,将当前元素 nums[i] 及其下标 i 存入哈希表
  2. 复杂度:时间复杂度O(N),空间复杂度O(N)。

  3. c++ 实现算法

vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> numMap; // 用于存储数字和它的索引//遍历数组 nums,从索引 i = 0 开始,直到数组的最后一个元素for (int i = 0; i < nums.size(); ++i) {int complement = target - nums[i]; // 计算当前数字需要的补数//检查哈希表中是否存在补数 complement。如果找到了,表示我们已经找到了一对数字,//它们的和为 target。find 函数用于查找哈希表中是否存在给定的键(complement)。//如果存在,find 会返回一个指向该元素的迭代器,否则返回 end()。if (numMap.find(complement) != numMap.end()) {return {numMap[complement], i}; // 返回补数的索引和当前数字的索引,找到了就直接返回不需要继续找了}//它的键是数组中的元素,值是该元素的索引。//通过 numMap[nums[i]] = i,我们将当前元素 nums[i] 的值作为键,将其索引 i 作为值存储在哈希表中。numMap[nums[i]] = i; }return {}; // 如果没有找到符合条件的结果,返回空数组
}
  1. 算法推演
  • 假设输入数组 nums = [2, 7, 11, 15] 和目标值 target = 9。

  • 步骤 1:初始化哈希表
    unordered_map<int, int> numMap; 这里创建了一个哈希表 numMap,它的键(key)是数组中的元素,值(value)是该元素的索引。哈希表的作用是快速查找数组中是否已经存在与当前数字相加等于目标值的数字。

  • 步骤 2:遍历数组
    我们开始遍历数组 nums。

    • 第一次迭代(i = 0,nums[i] = 2):
      计算补数:complement = target - nums[0] = 9 - 2 =7。
      检查哈希表中是否有 complement = 7: numMap.find(7) 返回 numMap.end(),表示没有找到补数。
      将 nums[0] = 2 和它的索引 0 存入哈希表:numMap[2] = 0。
      当前哈希表状态:numMap = {2: 0}。
    • 第二次迭代(i = 1,nums[i] = 7):
      计算补数:complement = target - nums[1] = 9 - 7 = 2。
      检查哈希表中是否有 complement = 2: numMap.find(2) 返回 numMap[2] = 0,表示找到了补数
      2,它的索引是 0。
      找到符合条件的两个数字:nums[0] = 2 和 nums[1] = 7,它们的和是 9。
      返回这两个索引:return {numMap[2], 1},即返回 [0, 1]。
  1. c++ 完整 demo
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> numMap; // 用于存储数字和它的索引//遍历数组 nums,从索引 i = 0 开始,直到数组的最后一个元素for (int i = 0; i < nums.size(); ++i) {int complement = target - nums[i]; // 计算当前数字需要的补数//检查哈希表中是否存在补数 complement。如果找到了,表示我们已经找到了一对数字,//它们的和为 target。find 函数用于查找哈希表中是否存在给定的键(complement)。//如果存在,find 会返回一个指向该元素的迭代器,否则返回 end()。if (numMap.find(complement) != numMap.end()) {return {numMap[complement], i}; // 返回补数的索引和当前数字的索引,找到了就直接返回不需要继续找了}//它的键是数组中的元素,值是该元素的索引。//通过 numMap[nums[i]] = i,我们将当前元素 nums[i] 的值作为键,将其索引 i 作为值存储在哈希表中。numMap[nums[i]] = i; }return {}; // 如果没有找到符合条件的结果,返回空数组
}int main() {vector<int> nums = {2, 7, 11, 15};int target = 9;vector<int> result = twoSum(nums, target);if (!result.empty()) {cout << "Indices: " << result[0] << ", " << result[1] << endl;} else {cout << "No solution found!" << endl;}return 0;
}

http://www.ppmy.cn/server/157963.html

相关文章

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …

QT Must be called on Chrome_UIThread; actually called on Unknown Thread.

具体错误 [4448:9040:0109/135034.634:FATAL:render_frame_host_impl.cc(672)] Check failed: ::content::BrowserThread::CurrentlyOn(BrowserThread::UI). Must be called on Chrome_UIThread; actually called on Unknown Thread. Backtrace:QWebEngineUrlSchemeHandler::q…

A2. 大语言模型llama API服务调研

自然语言模型大家听的比较多的是OpenAI,它有聊天(Chat)、补全(Completion)、提取结果信息(Extract Result Information)、模拟聊天(Mock Chat)等功能;还有其它语言模型比如Google公司研发的mBERT (Multilingual BERT)、BERT (Bidirectional Encoder Representations …

使用 SQL 和表格数据进行问答和 RAG(6)—将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库

将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库。以下是详细代码逻辑&#xff1a; 1. 类结构 该类包含三个主要方法&#xff1a; _prepare_db&#xff1a;负责将文件夹中的 CSV 和 XLSX 文件转换为 SQL 表。_validate_db&#xff1a;用于验证 SQL 数据库中创建的表是否…

kotlin项目无法访问Java类的问题

使用IntelliJ创建一个Kotlin项目&#xff0c;然后在src/main/kotlin中创建一个java接口&#xff1a;Animal.java&#xff0c;然后在Main.kt中打印这个java接口&#xff0c;如下&#xff1a; fun main() {println(Animal::class.java) }代码在编辑器中并没有报错&#xff0c;但…

消息队列架构、选型、专有名词解释

私人博客传送门 消息队列专有名词解释 | 魔筝炼药师 MQ选型 | 魔筝炼药师 MQ架构 | 魔筝炼药师 MQ顺序消息 | 魔筝炼药师

实现Android应用开机自启功能

在开发某些类型的Android应用程序时&#xff0c;可能需要在设备启动后自动运行该应用。例如&#xff0c;对于企业级应用、监控软件或特定的工具类应用来说&#xff0c;这一特性尤为重要。本文将详细介绍如何通过修改AndroidManifest.xml文件并编写相应的广播接收器来实现这一目…

运行npm install 时,卡在sill idealTree buildDeps没有反应

运行npm install 时&#xff0c;卡在sill idealTree buildDeps没有反应 原因&#xff1a; 淘宝镜像源的域名早已经过期&#xff0c;所以我们需要绑定新的镜像源。 2021 年&#xff0c;淘宝就发布了消息称&#xff0c;npm 淘宝镜像已经从 registry.npm.taobao.org 切换到了 re…