当前位置: 首页 > java >正文

Leetcode:1.两数之和

很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。

当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

本题就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。

那么我们就应该想到使用哈希法了。哈希表能将查找操作的时间复杂度从 O (n) 降至 O (1),从而大幅优化整体效率

因为本地,我们不仅要知道元素有没有遍历过,还有知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。

std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。

同理,std::map 和std::multimap 的key也是有序的

这道题目中并不需要key有序,选择std::unordered_map 效率更高!

map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下表,这样才能找到与当前元素相匹配的(也就是相加等于target)

接下来是map中key和value分别表示什么。

这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。

那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。

所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下表}。

在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> result;unordered_map<int, int> m;for (int i = 0; i < nums.size(); i++) {int tar = target - nums[i];auto it = m.find(tar);if (it != m.end()) {result.push_back(it->second);result.push_back(i);return result;}m.insert(make_pair(nums[i], i));}return result;}
};

用哈希表缓存已遍历的元素和下标,每次查找 tar 只需 O (1) 时间,整体从 O (n²) 降至 O (n)。

本质上就是用空间换时间,通过额外的哈希表存储信息,避免重复遍历。

哈希表在此处的作用:

快速映射:将「元素值」与「下标」绑定,通过值能直接找到对应的下标(无需遍历)。

实时缓存:边遍历边存储已访问的元素,确保每次查找的都是「之前出现过的元素」(避免重复计算)。

在编程问题中,当需要快速判断元素是否存在、高效统计元素出现的频率或次数,或是要在不同元素间建立键值对应关系以简化查找,以及希望通过优化嵌套循环中的查找操作来降低整体时间复杂度,且对元素顺序无严格要求时,通常适合使用哈希表,其核心优势在于以空间换时间,通过键值对的映射关系实现高效的查找、插入和删除操作,能有效解决各类依赖快速映射和统计的问题。实现数据高效的 CRUD 操作。

http://www.xdnf.cn/news/17041.html

相关文章:

  • 【C++】面向对象编程:继承与多态的魅力
  • Node.js 服务可以实现哪些功能
  • ethtool,lspci,iperf工具常用命令总结
  • 时间戳转换器
  • vector<int> adjList[MAX] 和 vector<int> adjList(MAX)的区别【C++】
  • 【Linux系统】进程间通信:匿名管道
  • UE5的渲染Debug技巧
  • 块三角掩码(Block-Triangular Masking)
  • Java 中也存在类似的“直接引用”“浅拷贝”和“深拷贝”
  • feign日志学习记录
  • k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC
  • VUE-第二季-01
  • python批量gif图片转jpg
  • 【DL学习笔记】深入学习tenser
  • Claude Code入门学习笔记(一)--Claude Code简介
  • ICCV 2025 | EPD-Solver:西湖大学发布并行加速扩散采样算法
  • 多线程异步日志系统与实现及 TCP/IP C/S 模型
  • 解剖 .NET 经典:从 Component 到 BackgroundWorker
  • AD方案(OpenLDAP或微软AD)适配信创存在的不足以及可能优化方案
  • Redis面试精讲 Day 9:Redis模块开发与扩展
  • 【数据迁移】Windows11 下将 Ubuntu 从 C 盘迁移到 D 盘
  • 每日面试题20:spring和spring boot的区别
  • Spring MVC 九大组件源码深度剖析(一):MultipartResolver - 文件上传的幕后指挥官
  • Go语言实战案例:TCP服务器与客户端通信
  • Uniapp一根数据线实现真机调试运行【uniapp如何把项目运行在手机上】
  • 昇思学习营-开发版-模型推理和性能优化
  • Kaggle 竞赛入门指南
  • Jetson Orin NX/NANO+ubuntu22.04+humble+MAVROS2安装教程
  • LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
  • Nginx相关实验(2)