算法日常・每日刷题--<哈希>1

1. 两数之和 - 力扣(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) 的算法吗?https://leetcode.cn/problems/two-sum/

一、题目回顾

给定整数数组 nums 和目标值 target,找出数组中相加等于 target 的两个数字,返回二者下标。

  • 输入保证唯一解;同一个元素不能使用两次;下标返回顺序不限。

二.解法

思想:空间换时间

暴力双层循环时间复杂度 \(O(n^2)\),大数据场景效率低下。 我们借助**哈希表unordered_map**将查询操作平均时间降到 \(O(1)\),整体时间复杂度优化至 \(O(n)\)。

哈希表存储映射关系:数组元素值 → 元素下标 遍历流程:

  1. 设当前遍历元素 nums[i],计算互补值 k = target - nums[i];
  2. 查询哈希表中是否存在互补值 k;
    • 存在:直接返回 {哈希表中k对应的下标, 当前下标i};
    • 不存在:把当前 nums[i] 和下标插入哈希表,留给后续元素匹配。

⚠️ 关键顺序:先查询,后插入 如果先插入再查询,会读取刚存入的当前元素,造成同一个元素重复使用,违反题目要求。

cpp 复制代码
#include<unordered_map>
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n=nums.size();
        unordered_map<int,int> hash(n);
        for(int i=0;i<n;i++)
        {
            int k=target-nums[i];
            if(hash.count(k)>0)
            {
                return {hash[k],i};
            }
            hash.insert({nums[i],i});
        }
        return {-1,-1};
    }
};
相关推荐
Discipline10291 小时前
尼泊尔河流流量:天气驱动的预测与高流量风险
人工智能·算法
XuCoder1 小时前
改一个数,右边全得重算,这题怎么扛住两万次查询
算法
小羊没烦恼!2 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
weixin_307779132 小时前
基于睿擎工业开发平台的预训练视觉模型轻量化适配与低代码部署优化
开发语言·算法
hold?fish:palm2 小时前
45 二叉树的右视图
开发语言·c++·算法
粤鼎恒业3 小时前
惠州工厂电子料回收厂家推荐:从交接单反推筛选标准
大数据·数据库·算法·硬件架构·硬件工程·pcb工艺·材料工程
小爷毛毛(卓寿杰)3 小时前
【Agent 意图识别】输出协议、评估与置信度
人工智能·算法·大模型·prompt·大语言模型·agent
优质酸酸乳3 小时前
力扣100题之21合并两个有序链表
算法·leetcode·链表
旖旎夜光3 小时前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控
旋生万物4 小时前
Agent System Prompt 注入螺旋公理:让 AI 推理不跑偏的可复制模板(附完整 Prompt)
人工智能·算法