news 2026/4/18 10:00:42

两数之和:从暴力到哈希表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
两数之和:从暴力到哈希表

问题描述

给定一个整数数组nums和一个整数目标值target,在数组中找出和为目标值的两个整数,并返回它们的数组下标。题目保证只有一个有效答案,且不能使用两次相同的元素。

解题思路

1. 暴力解法:双重循环

  • 核心思想:遍历数组中的每个元素,再遍历其后的所有元素,检查两数之和是否等于target
  • 时间复杂度:O(n²)(n为数组长度,最坏情况下需遍历n*(n-1)/2次)。
  • 空间复杂度:O(1)(无需额外空间)。
  • 示例代码
vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (nums[i] + nums[j] == target) { return {i, j}; } } } return {}; // 题目保证有解,实际不会执行 }

2. 哈希表优化:空间换时间

  • 核心思想:使用哈希表(unordered_map)存储已遍历元素的值和下标,遍历数组时,计算当前元素与target的差值complement,若complement存在于哈希表中,则直接返回两个下标;否则将当前元素存入哈希表。
  • 时间复杂度:O(n)(仅需遍历一次数组,哈希表查询时间为O(1))。
  • 空间复杂度:O(n)(最坏情况下需存储n-1个元素)。
  • 示例代码

#include <unordered_map>

#include <vector>

using namespace std;

class Solution {

public:

vector<int> twoSum(vector<int>& nums, int target) {

unordered_map<int, int> numMap; / /key: 元素值,value: 下标

for (int i = 0; i < nums.size(); ++i) {

int complement = target - nums[i];

if (numMap.find(complement) != numMap.end()) {

return {numMap[complement], i}; // 返回已存下标和当前下标

}

numMap[nums[i]] = i; // 存入当前元素

}

return {}; // 题目保证有解,实际不会执行 }

};

方法对比

方法时间复杂度空间复杂度适用场景
暴力解法O(n²)O(1)数组规模较小(n<1000)
哈希表优化O(n)O(n)数组规模较大(n≥1000)

注意事项

  1. 元素唯一性:题目要求“不能使用两次相同的元素”,因此哈希表存储的是已遍历元素,避免重复使用当前元素(如示例3中的[3,3],第一个3存入哈希表后,第二个3计算complement=3时,直接返回两个下标)。
  2. 返回顺序:哈希表中存储的是已遍历元素的下标,因此返回时需先返回哈希表中的下标(如示例2中的[3,2,4],遍历到2时,complement=4不存在,存入2→1;遍历到4时,complement=2存在,返回[1,2])。

总结

两数之和问题的最优解是哈希表优化法,通过空间换时间将时间复杂度从O(n²)降至O(n),适用于大多数场景。暴力解法虽然简单,但效率较低,仅适用于小规模数据。在实际开发中,应优先选择哈希表优化法,以提升程序性能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:23:11

阿里云渠道商:轻量应用服务器连接常见问题与解决指南

一、为什么你的轻量服务器连不上&#xff1f;当新购的阿里云轻量应用服务器首次远程连接失败时&#xff0c;90% 的故障集中在以下场景&#xff1a; Windows 系统卡在 “远程桌面连接” 黑屏 Linux 系统 SSH 报错 "Connection timed out" 宝塔面板 / 应用镜像无法访问…

作者头像 李华
网站建设 2026/4/18 2:28:15

18、GTK+开发全解析:从基础到高级应用

GTK+开发全解析:从基础到高级应用 1. 符号与基础概念 在GTK+开发中,一些特殊符号有着重要的作用。例如,#(井号)符号在RC文件中使用;*(星号)既可以作为不可见字符,也能作为通配符;_(下划线)在一些特定场景下使用。同时,像 <gdk/gdkkeysyms.h> 和 <gl…

作者头像 李华
网站建设 2026/4/18 2:25:53

协同过滤电影推荐系统(11448)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/17 16:16:50

实时视频处理技术:重塑视觉交互体验的未来趋势

在数字时代的浪潮中&#xff0c;实时视频处理技术正以惊人的速度重塑着人们的视觉交互体验。从远程会议中的智能美颜到自动驾驶汽车的环境感知&#xff0c;从直播平台的实时特效到医疗领域的影像诊断&#xff0c;这项技术已经渗透到社会生活的方方面面&#xff0c;成为推动各行…

作者头像 李华
网站建设 2026/4/18 2:24:20

Wan2.2-T2V-A14B vs 国际主流T2V模型:画质对比评测

Wan2.2-T2V-A14B vs 国际主流T2V模型&#xff1a;画质对比评测 在影视预演、广告创意和数字人内容爆发的今天&#xff0c;一个核心问题正被频繁提出&#xff1a;我们能否用一句话&#xff0c;“生成一段电影级质感的视频”&#xff1f;这不再是科幻设想——随着文本到视频&…

作者头像 李华
网站建设 2026/4/18 2:29:51

【系统移植篇】系统烧写

文章目录【系统移植篇】系统烧写1 环境准备2 固化系统到SD卡2 固化系统到EMMC【系统移植篇】系统烧写 1 环境准备 下载burn文件夹&#xff1a; 通过网盘分享的文件&#xff1a;burn 链接: https://pan.baidu.com/s/1NnxOFErna5NIzGdePpi0XQ?pwdpzs6 提取码: pzs6该文件夹的…

作者头像 李华