算法日常・每日刷题--<哈希>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};
    }
};
相关推荐
心仪久了会沦陷24 分钟前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方29 分钟前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん2 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者2 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康4 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法
秋天的怀念_David5 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
NEFU_Jyj7 小时前
贝尔数(组合数学)
算法
希和20278 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Pniubi8 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
布莱克60518 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map