算法日常・每日刷题--<哈希>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};
    }
};
相关推荐
多弗朗皮卡丘6 分钟前
C++ 哈希(下)
c++·算法·哈希算法
aichitang202420 分钟前
Meta Muse Spark Open:816B 巨型开放权重多模态 Agent 模型架构、部署实战与社区首测全解
大数据·人工智能·python·算法·ai·架构·spark
Coder-magician1 小时前
图论总结篇
算法·图论
有同事要进步1 小时前
Leecode第68题:x的平方根
java·数据结构·算法
吹什么轩1 小时前
linux系统复习:进程优先级与O(1)调度
java·linux·算法
开开心心就好1 小时前
安卓PDF处理工具,免费无广告零弹窗
android·服务器·开发语言·算法·pdf·ocr
zyl76517 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖21 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌21 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F21 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人