Day14(哈希表)

💫坚持学习,保持进步。(ง •_•)ง


📆学习日期:2025年2月1日21:54:54

💻学习内容:两数之和 | 代码随想录

⏲️学习时长:1h20min

练习题目1
题目描述

1. 两数之和 - 力扣(LeetCode)

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

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

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

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 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 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

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

解题思路
  • 整体思路&&注意事项
  1. 经典哈希表题目,使用map来解决
  2. 为什么使用哈希法:哈希法适合判断一个元素是否出现过,判断一个元素是否在集合中。

例如:[2,7,3,6],target=9,遍历到元素'7',需要判断之前是否有元素‘2’

  1. 本题需要保存两种数据,①是元素值,②是下标值,使用数组和set都无法解决,因此需要使用 map 结构,使用键值对(key,value) 待思考
  2. map 究竟做了什么?起到什么作用?:
  • 存放遍历过的元素及其下标

使用数组和set的局限性

使用数组和set来做哈希法的局限。

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。


  • 代码实现
  1. 使用unordered map,读写效率最高 待总结
  2. 新建一个map
  3. 遍历数组元素,在此过程中,判断该元素nums[i]与目标值target的差值是否在map中出现过,是则返回,否则将新元素存入map,更新哈希表。
  4. return{};//map以元组的形式存放?

Bug

对map的使用方法不熟悉,多写写就记住了(ง •_•)ง

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map;//定义map
        int temp;

        for(int i=0;i<nums.size();i++){
            temp=target-nums[i];

            auto iter=map.find(temp);//find方法,根据key进行寻找,返回迭代器。所以key为元素值,需要操作的,value为下标值,不需要操作的
            if(iter!=map.end()){//判断是否遍历过
                return{iter->second,i};//返回相应下标
            }
            map.insert(pair<int,int>(nums[i],i));//更新map

        }

        return {};//未找到,返回空
        
    }
};
学习总结

之前的STL没有学完,怪不得不知道set/map容器....😿C++提高编程

  1. map的创建
  2. map的索引
  3. map的方法
  4. map的返回

字典|map | c++中unordered_map的用法的详述(包含unordered_map和map的区别)_unorder map-优快云博客

  1. 继续学习C++的STL,还是学习python数据结构?
  2. 根据岗位需求,选择编程语言(吧)
相关题目

15. 三数之和18. 四数之和167. 两数之和 II - 输入有序数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值