Leetcode:1. 两数之和

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = 2,7,11,15, target = 9

输出:0,1

解释:因为 nums0 + nums1 == 9 ,返回 0, 1 。
示例 2:

输入:nums = 3,2,4, target = 6

输出:1,2
示例 3:

输入:nums = 3,3, target = 6

输出:0,1

提示:

2 <= nums.length <= 104

-109 <= numsi <= 109

-109 <= target <= 109

只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

题目

cpp 复制代码
class Solution {
public:
    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 {};
    }
};

方法二

哈希表

cpp 复制代码
class Solution {
public:
    // 两数之和解法:哈希表优化查找
    vector<int> twoSum(vector<int>& nums, int target) {
        // 哈希表:键为数组中的数值,值为该数值对应的索引(用于快速查找)
        unordered_map<int, int> hashtable;  // 存储已遍历过的元素信息
        // 遍历数组,i为当前元素的索引
        for (int i = 0; i < nums.size(); ++i) {
            // 计算当前元素需要的"互补数"(即target - 当前数)
            int complement = target - nums[i];
            // 在哈希表中查找是否存在该互补数
            auto it = hashtable.find(complement);  // it是查找结果的迭代器
            // 若找到互补数(it不等于哈希表尾后迭代器)
            if (it != hashtable.end()) {
                // 返回互补数的索引(it->second)和当前元素的索引i
                return {it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {};
    }
};

假设 nums = 2, 7, 11, 15,target = 9:

遍历第一个元素(i=0,值为 2):

计算 target - 2 = 7,哈希表为空,未找到。

将 2:0 存入哈希表。

遍历第二个元素(i=1,值为 7):

计算 target -7 = 2,在哈希表中找到键为 2(对应索引 0)。

返回 0, 1(即 2+7=9)。

相关推荐
RaaS10013 分钟前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码27 分钟前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
TunerT_TQ32 分钟前
超立方体Ramsey(openai/math 家族171)H11攻坚日志|D60–D69:Star分组重数、二幂坐标群、奇偶入射语义与Site‑Level候选计数形式化闭环
算法
Rabitebla1 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
远离UE41 小时前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6581 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法
FPGA小徐1 小时前
【一生一芯 / PA】AM 核心文件逐行解析(上):从 start.S 到 gpu.c
前端·算法
Tairitsu_H2 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划
凯瑟琳.奥古斯特3 小时前
动态调优IoU提升OCR文本合并精度
开发语言·python·算法
布莱克6053 小时前
A* 算法详解:从原理到实现
开发语言·c++·算法