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

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

问题描述

给定一个整数数组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),适用于大多数场景。暴力解法虽然简单,但效率较低,仅适用于小规模数据。在实际开发中,应优先选择哈希表优化法,以提升程序性能。

http://www.cnnetsun.cn/news/10287.html

相关文章:

  • 金融项目的测试过程(额度申请审核的测试点设计)
  • C# AES加密在医疗系统中的真实应用案例(含完整源码与审计建议)
  • java计算机毕业设计球鞋商城系统小程序 基于SpringBoot的潮鞋微商城小程序设计与实现 JavaWeb限量球鞋交易平台小程序开发
  • Wan2.2-T2V-A14B能否生成黑白老电影风格?怀旧滤镜测试
  • 终极指南:原神自动化工具BetterGI完整使用手册
  • 在Linux中如何查看内存使用情况?
  • CompletableFuture的5大坑!
  • **主题:** “医疗PINN漏物理约束,器官运动预测全错,补动力学方程才稳住”
  • KMPlayer播放器中文版下载安装保姆级教程(附电脑安装包,非常详细)
  • 【量子电路可视化终极指南】:手把手教你用VSCode打造高效开发环境
  • Skyhigh Security升级数据安全态势管理(DSPM)能力,助力企业满足《数字个人数据保护法》(DPDPA)合规要求,强化亚太地区数据保护
  • Wan2.2-T2V-A14B与Stable Video Diffusion对比:谁更适合商用?
  • 如何用AU处理音乐详细的元数据Metadata-程序员·原创音乐人·卓伊凡
  • MobaXterm高效运维
  • 百度ERNIE-4.5-VL-28B-A3B-Base震撼发布:多模态大模型基座开启智能新纪元
  • Wan2.2-T2V-A14B + 高性能GPU:构建专属AI视频工厂
  • 3分钟掌握B站视频下载:哔哩下载姬终极使用指南
  • BetterGI:原神AI自动化辅助工具终极指南
  • MoE架构加持的Wan2.2-T2V-A14B,如何提升动态细节表现力?
  • MySQL表的约束
  • IP地址分类管理
  • Windows右键菜单大扫除:从杂乱无章到高效简洁的完整改造方案
  • 如何为个人网站选择一个高性价比域名?
  • Adobe官方卸载工具下载安装保姆级教程(附下载地址,非常详细)
  • shell笔记
  • 多头和q,kv的区别
  • 为什么加上位置编码后 patch 会有空间信息 需要解释一下
  • 基于Springboot船舶监造管理系统【附源码+文档】
  • 从原型到产品:融合算子的单元测试、集成测试与持续集成
  • Servlet原理Mapping问题ServletContext对象