算法日常・每日刷题--<哈希>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};
    }
};
相关推荐
zander2581 小时前
LeetCode 207. 课程表
算法·深度优先
萌动的小火苗2 小时前
深度学习中的损失函数与优化算法基础知识
人工智能·深度学习·算法
happyprince2 小时前
02_OpenCodeReview 具体观:八种算法机制与背后的论文谱系
算法
变量未定义~2 小时前
图论+动态规划——魔法阵
算法
大爱编程♡2 小时前
C++基础-类和对象
c++·算法
ysa0510302 小时前
【板子】费用流
算法·深度优先·图论
玖玥拾2 小时前
LeetCode 80 删除有序数组中的重复项 II
算法·leetcode
青山木2 小时前
Hot 100 --- 电话号码的字母组合
java·数据结构·算法·leetcode·逻辑回归
闪电悠米3 小时前
力扣hot100-240.搜索二维矩阵2-单调性剪枝详解
数据结构·算法·leetcode·矩阵·哈希算法