![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
哈希表
想名字多费事
编程小白入驻
展开
-
数组中只出现一次的数字+第一个只出现一次的字符
//哈希法:mapclass Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { unordered_map<int,int> map; for(int ii=0;ii<data.size();ii++){ map[data[ii]]++; } au.原创 2021-08-24 15:55:16 · 115 阅读 · 0 评论 -
四数之和
四数之和,和三数之和是一个思路,都是使用双指针法, 基本解法就是在三数之和 的基础上再套一层for循环。但是要注意,不要判断nums[ii] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如这个例子就不能通过[1,-2,-5,-4,-3,3,3,5]-11三数之和的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下表作为双指针,找到nums[ii].原创 2021-05-06 20:07:00 · 314 阅读 · 0 评论 -
三数之和
双指针法C++代码首先将数组排序,然后有一层for循环,i从下表0的地方开始,同时定一个下表left 定义在i+1的位置上,定义下表right 在数组结尾的位置上。依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i] b = nums[left] c = nums[right]。如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以.原创 2021-05-06 19:08:51 · 185 阅读 · 2 评论 -
赎金信
暴力枚举class Solution {public: bool canConstruct(string ransomNote, string magazine) { for(int ii=0;ii<magazine.size();ii++){ // 在ransomNote中找到和magazine相同的字符 for(int jj=0;jj<ransomNote.size();jj++){ .原创 2021-05-05 14:20:16 · 67 阅读 · 0 评论 -
四数相加II
「本题是使用哈希法的经典题目,而第18题. 四数之和,第15题.三数之和 并不合适使用哈希法」,因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。「而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!」如果本题想难度升级:就是给出一个数组(而不是四个数组),在这里找出四个元素相加等于0,答案.原创 2021-05-05 11:00:48 · 118 阅读 · 0 评论 -
两数之和
思路很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。使用哈希法最为合适,但为什么不能用数组和set呢?因为数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为要返回x 和 y的下表。所以set 也不能用。此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下表。st.原创 2021-05-05 09:00:17 · 71 阅读 · 0 评论 -
快乐树
题目中说了会 「无限循环」,那么也就是说「求和的过程中,sum会重复出现,这对解题很重要!」当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。判断sum是否重复出现就可以使用unordered_set。「还有一个难点就是求和的过程,如果对取数值各个位上的单数操作不熟悉的话,做这道题也会比较艰难。」class Solution {public: .原创 2021-05-04 22:38:25 · 61 阅读 · 0 评论 -
两个数组的交集
本质上就是找出两个数组相同的元素集合。注意题目特意说明:「输出结果中的每个元素一定是唯一的,也就是说输出的结果是去重的, 同时可以不考虑输出结果的顺序」那么就开始考虑不需要对数据进行排序,而且还不会让数据重复的一种数据结构,我们选择unordered_set。读写效率是最高的很完美。class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>&am.原创 2021-05-04 18:40:54 · 89 阅读 · 0 评论 -
有效的字母异位词
哈希表法「数组其实就是一个简单哈希表」,而且这道题目中字符串只有小写字符,那么就可以定义一个大小为26的数组(因为字符a到字符z的ASCII也是26个连续的数值。),来记录字符串s里字符出现的次数。class Solution {public: bool isAnagram(string s, string t) { if(s.size()==0||t.size()==0||s.size()!=t.size()) return false; vector<int.原创 2021-05-04 17:22:13 · 47 阅读 · 0 评论 -
哈希表基础知识
哈希表1、哈希表是根据关键码的值而直接进行访问的数据结构。2、一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在这所学校里。要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1) 就可以做到。我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。将学生姓名映射到哈希表上就涉及到了「hash function ,也就是哈希函数」。哈希函数哈希函数,把学生的姓名直接映射为哈希表上的索引,然后就可原创 2021-05-04 15:29:15 · 181 阅读 · 0 评论