news 2025/12/24 1:44:23

力扣解题步骤

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣解题步骤
核心思路回顾

通过哈希表存储「已遍历元素值 → 下标」的映射,遍历数组时计算当前元素的 “补数”(目标值 - 当前值),若补数存在于哈希表中,则直接返回结果;若不存在,将当前元素存入哈希表,继续遍历。

详细解题步骤

假设输入为vector<int> numsint target,最终返回vector<int>类型的下标数组,具体步骤如下:

步骤 1:引入必要头文件 & 命名空间

C++ 中需要引入vector(存储数组)和unordered_map(哈希表)的头文件,并用using namespace std;简化代码(也可显式写std::):

cpp

运行

#include <vector> // 用于存储数组和返回结果 #include <unordered_map> // 哈希表容器 using namespace std;
步骤 2:定义函数 & 初始化哈希表

函数返回值为vector<int>,参数为数组引用nums和目标值target;创建空的unordered_map,键为元素值(int),值为元素下标(int):

cpp

运行

vector<int> twoSum(vector<int>& nums, int target) { // 初始化哈希表:键=元素值,值=元素下标 unordered_map<int, int> hashMap;
步骤 3:遍历数组,逐个检查补数

使用for循环遍历数组,i为当前元素下标,nums[i]为当前元素值:

  1. 计算补数:complement = target - nums[i](需要找到的另一个数);
  2. 检查补数是否在哈希表中:
    • 若存在:返回哈希表中补数对应的下标 + 当前下标i
    • 若不存在:将当前元素值和下标存入哈希表,继续遍历。

代码实现:

cpp

运行

// 遍历数组,i为下标,nums[i]为当前元素 for (int i = 0; i < nums.size(); ++i) { int complement = target - nums[i]; // 计算补数 // 检查补数是否在哈希表中(find返回迭代器,end()表示未找到) if (hashMap.find(complement) != hashMap.end()) { // 找到则返回结果:补数下标 + 当前下标 return {hashMap[complement], i}; } // 未找到则将当前元素和下标存入哈希表 hashMap[nums[i]] = i; }
步骤 4:兜底返回(语法要求)

题目保证输入必有唯一答案,因此此处仅为满足函数语法要求,返回空数组:

cpp

运行

// 题目保证有解,此处仅兜底 return {}; }
步骤 5:测试函数(可选)

编写main函数测试示例用例,验证结果正确性:

cpp

运行

#include <iostream> // 用于输出结果 int main() { // 示例1:nums = [2,7,11,15], target = 9 vector<int> nums1 = {2, 7, 11, 15}; int target1 = 9; vector<int> res1 = twoSum(nums1, target1); cout << "示例1结果:[" << res1[0] << ", " << res1[1] << "]" << endl; // 示例2:nums = [3,2,4], target = 6 vector<int> nums2 = {3, 2, 4}; int target2 = 6; vector<int> res2 = twoSum(nums2, target2); cout << "示例2结果:[" << res2[0] << ", " << res2[1] << "]" << endl; // 示例3:nums = [3,3], target = 6 vector<int> nums3 = {3, 3}; int target3 = 6; vector<int> res3 = twoSum(nums3, target3); cout << "示例3结果:[" << res3[0] << ", " << res3[1] << "]" << endl; return 0; }

关键步骤解析(以示例 2 为例:nums = [3,2,4], target = 6)

遍历次数下标 i当前值 nums [i]补数 complement哈希表状态(存入前)检查结果哈希表状态(存入后)
1036-3=3未找到补数{3:0}
2126-2=4{3:0}未找到补数{3:0, 2:1}
3246-4=2{3:0, 2:1}找到补数 2(下标 1)无需存入

最终返回[1, 2],符合示例 2 结果。

暴力解法的解题步骤(对比参考)

若用暴力法,步骤如下(时间复杂度 O (n²)):

  1. 外层循环遍历每个元素,下标i从 0 到nums.size()-1
  2. 内层循环遍历i之后的元素,下标ji+1nums.size()-1
  3. 检查nums[i] + nums[j] == target,若满足则返回{i, j}
  4. 题目保证有解,无需处理无结果情况。

暴力法代码:

cpp

运行

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 {}; }

核心注意点

  1. 哈希表选择unordered_map是哈希表,查找 / 插入平均 O (1);若用map(红黑树),时间复杂度会升至 O (logn),效率更低;
  2. 避免重复元素:先检查补数,再存入当前元素,确保不会使用同一个元素(如示例 3 的 [3,3]);
  3. 返回值:C++ 中直接返回vector<int>,满足 “返回数组下标” 的要求。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/19 3:26:25

企业级中小社区疫情信息管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 近年来&#xff0c;全球范围内的突发公共卫生事件频发&#xff0c;尤其是新冠疫情的暴发&#xff0c;凸显了社区疫情防控信息化建设的重要性。传统社区疫情管理多依赖人工登记和纸质档案&#xff0c;存在效率低、数据共享困难、信息更新滞后等问题&#xff0c;难以应对大规…

作者头像 李华
网站建设 2025/12/19 3:22:57

我发现多中心数据术语冲突 后来用SNOMEDCT编码统一才对齐

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 目录医疗数据科学&#xff1a;当Excel表格遇见心跳监测仪 一、从“算术课代表”到医疗数据民工 二、AI诊断系统&#xff1a;当神经网络开始学中医把脉 三、可穿戴设备&#xff1a;当智能手表开始管我吃火锅 四、医疗大数…

作者头像 李华
网站建设 2025/12/19 3:15:19

JVM(JAVA虚拟机内存不足)

这是本人第二次遇到这个问题&#xff0c;打开pycharm还没有Start就撒由那拉了&#xff0c;报出来一堆IDE错误&#xff0c;看都看不懂&#xff0c;上次遇到是大模型的指导改了配置文件依然没解决&#xff0c;这次跟着大佬操作&#xff0c;电脑十分丝滑 步骤&#xff08;win11&am…

作者头像 李华
网站建设 2025/12/23 19:47:26

类变量和全局变量的生命周期分别是多久?

类变量和全局变量的生命周期核心差异在于创建时机、存活范围、销毁条件&#xff0c;本质由它们的 “归属对象”&#xff08;类 vs 模块&#xff09;决定&#xff0c;以下是分维度的精准解析&#xff1a;一、先明确核心前提Python 中变量的生命周期依附于其所属的命名空间对象&a…

作者头像 李华
网站建设 2025/12/19 2:53:55

前后端分离考试系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展&#xff0c;传统考试系统在效率、灵活性和用户体验方面逐渐暴露出局限性。传统系统通常采用前后端耦合的设计模式&#xff0c;导致系统维护困难、扩展性差&#xff0c;难以满足现代教育中对个性化考试和实时数据分析的需求。前后端分离架构通过将用…

作者头像 李华