有序的map_哈希表:map等候多时了

2acc512f193697fb6d5f8af7cd1639aa.gif 给「代码随想录」一个星标吧!

哈希法中只用数组和set还是不够的!

第1题. 两数之和

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

「示例:」

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路

很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。

使用哈希法最为合适,之前已经介绍过,数组和set在哈希法中的应用,那么来看一下使用数组和set来做哈希法的局限。

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

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

C++中map,有三种类型:

e5828c9d7b6276551c369a64669deb0e.png

std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。

同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看关于哈希表,你该了解这些!。

「这道题目中并不需要key有序,选择std::unordered_map 效率更高!」

C++代码

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        std::unordered_map  map;for(int i = 0; i             auto iter = map.find(target - nums[i]);if(iter != map.end()) {return {iter->second, i};
            }
            map.insert(nums[i], i);
        }return {};
    }
};

欢迎在评论区留言讨论!

我将算法学习相关的资料已经整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图看一看一定会有所收获!

-------end------- 因为公众号改版,时间线被打乱,一些精彩文章大家可能错过了。如果感觉这里的文章对你有帮助, 赶紧给「代码随想录」加一个星标吧,方便第一时间阅读文章 往期 精彩回顾哈希表:今天你快乐了么?哈希表:哈希值太大了,还是得用set哈希表:可以拿数组当哈希表来用,但哈希值不要太大! 「代码随想录」期待你的关注!

每天一道经典算法题目,助你轻松学习算法!

a3583e9091967f5b10a33053fe1b60b6.png我就知道你[在看] b8dc3613359a64256129b1847235270a.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值