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

【Leetcode hot 100】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]

问题解决

方法一:哈希表优化(推荐,时间复杂度 O(n))

核心思路
利用 哈希表(HashMap 记录已遍历的数字及其索引,将“查找互补数”的操作从 O(n) 优化到 O(1)

  1. 遍历数组时,对当前数字 nums[i],计算其与目标值的 互补数 complement = target - nums[i]
  2. 若互补数已存在于哈希表中,说明找到符合条件的两个数,直接返回两者的索引。
  3. 若不存在,将当前数字和其索引存入哈希表,供后续遍历使用。

代码实现

import java.util.HashMap;
import java.util.Map;class Solution {public int[] twoSum(int[] nums, int target) {// 哈希表:键为数组元素值,值为对应索引Map<Integer, Integer> numMap = new HashMap<>();for (int i = 0; i < nums.length; i++) {int complement = target - nums[i]; // 计算互补数// 若互补数已存在,直接返回结果if (numMap.containsKey(complement)) {return new int[]{numMap.get(complement), i};}// 否则,将当前数字和索引存入哈希表numMap.put(nums[i], i);}// 题目保证有解,此处仅为语法兼容(实际不会执行)return new int[]{};}
}

代码解释

  • 哈希表 numMap:存储已遍历的 数字 → 索引 映射,支持快速查找(containsKeyget 操作均为 O(1))。
  • 遍历逻辑:
    • 对每个数字 nums[i],先计算互补数 complement,优先检查互补数是否已存在(避免重复使用同一元素,例如 nums = [3,3]target=6 时,第一次存 3→0,第二次查 complement=3 存在,返回 [0,1])。
    • 若互补数不存在,再将当前数字存入哈希表,保证后续遍历能找到它。

方法二:暴力枚举(直观但低效,时间复杂度 O(n²))

核心思路
通过 两层嵌套循环 枚举所有可能的数对 (nums[i], nums[j])i < j,避免重复),检查它们的和是否等于 target

代码实现

class Solution {public int[] twoSum(int[] nums, int target) {// 外层循环:固定第一个数的索引 ifor (int i = 0; i < nums.length; i++) {// 内层循环:遍历 i 之后的数,避免重复计算for (int j = i + 1; j < nums.length; j++) {if (nums[i] + nums[j] == target) {return new int[]{i, j};}}}// 题目保证有解,此处仅为语法兼容return new int[]{};}
}

优缺点分析

  • 优点:逻辑直观,无需额外空间(空间复杂度 O(1))。
  • 缺点:时间复杂度 O(n²),当数组很大时(如 n=10^4),性能会急剧下降(10^8 次运算)。

复杂度对比

方法时间复杂度空间复杂度适用场景
哈希表优化O(n)O(n)大数据量
暴力枚举O(n²)O(1)小数据量

实际工程中,哈希表优化法 是更优的选择,也是 LeetCode 该题的推荐解法。

http://www.lryc.cn/news/606840.html

相关文章:

  • 切比雪夫不等式
  • qcustomplot 大量数据拖拽卡顿,开启opengl
  • SketchUp扩展工具分享:Ropefall v1.02插件轻松实现绳索模拟
  • 1、【C语言】【进阶】数组,指针与退化
  • 函数fdopendir的用法
  • [vue3 echarts] echarts 动态数据更新 setInterval
  • 深度学习(鱼书)day08--误差反向传播(后三节)
  • 轻钢屋顶电动排烟窗(工业用)
  • ansible.cfg 配置文件的常见配置项及其说明
  • SQL中的HAVING用法
  • MySQL--组从复制的详解及功能演练
  • 从O(n²)到O(n log n):深度剖析快速排序的内存优化与cache-friendly实现
  • 高级11-Java日志管理:使用Log4j与SLF4J
  • Oracle EBS 缺少adcfgclone.pl文件
  • 电商前端Nginx访问日志收集分析实战
  • 汇川ITS7100E触摸屏交互界面开发(一)调试事项说明
  • 25电赛e题杂乱环境稳定识别矩形框(附源码)
  • Vue3 Vue3中的响应式原理
  • StarRocks vs. Trino
  • 九联UNT403HS_海思MV320处理器_安卓9-优盘强刷刷机包
  • 嵌入式 Linux 深度解析:架构、原理与工程实践(增强版)
  • 企业级LLM智能引擎 的完整解决方案,整合了 SpringAI框架、RAG技术、模型控制平台(MCP)和实时搜索,提供从架构设计到代码实现的全面指南:
  • cloudflare worker + Cloudflare AI Gateway
  • 如何在不依赖 Office 的情况下转换 PDF 为可编辑文档
  • python中appium
  • K8S周期性备份etcd数据实战案例
  • 精通分类:解析Scikit-learn中的KNN、朴素贝叶斯与决策树(含随机森林)
  • 应用药品注册证识别技术,为医药行业的合规、高效与创新发展提供核心驱动力
  • 智能图书馆管理系统开发实战系列(四):后端C++ DLL开发与模块化设计
  • Dify版本升级实操