RTTO WEEK2
WEEK 2
242.有效的字母异位词(e)
开辟一个record数组size为26;
首先遍历s,把字母在相应位置进行累加计数;
其次遍历t,把字母在相应位置进行累减计数;
最后遍历record数组,若有元素不为0,则返回false;否则返回true;
383.赎金信(e)
同上,最后判断record数组中是否有-1;
49.字母异位词分组(m)
该题目标为,给定一个字符串的list,需要把由相同字母构成的字符串自行分组。
首先遍历整个字符串列表,再将每个字符串自行排序;
将经过排序后的字符串放入一个哈希表,key为排序后的字符串,value为排序前的原字符串;
这样拥有相同字符的字符串会共享同一个key,只需取出相同key的vector;
vector<vector<string>>
二维string数组
unordered_map<string,vector<string>> map
一个无序hashmap,key是string,用于存放正序的素材字符串;value是string list,用于存放key字母构成的字符串
438.找到字符串中所有字母异位词(m)
构造sCount和pCount两个哈希表(size=26)用于存储每个字母分别在s和t中出现的次数;
保证pLen长度的窗口进行滑动,判断sCount和pCount是否相等;
两个string先遍历pLen的长度,更新sCount和pCount,若此时sCount == pCount,则push_back(0);
再从pLen+1个元素开始遍历s,减少滑动窗口第一个元素的出现次数,增加滑动窗口最后一个元素(新遍历的元素)的出现次数,若遍历过程中sCount == pCount,则push_back(i+1);
349.两个数组的交集(e)
unordered_set 底层哈希表实现;
unordered_set<int> nums_set(nums1.begin(),nums1.end());
复制nums1
unordered_map常用操作详解:(70条消息) unordered_set中end()与find()的使用_bulangman277的博客-CSDN博客
需要注意的是,使用了一个result_set用于最后结果的去重,最后再从set中取元素到vector中返回;
350.两个数组的交集Ⅱ(e)
数据范围合理的情况下可使用hash;
先构建两个hashmap来存放每种元素的出现次数;
最后检索两个构建好的hashmap,取同一元素出现次数的最小值m,添加m次该元素到最后的结果上;
202.快乐数(e)
由于该过程中求和的过程会重复出现,可单独封装一个getSum()方法;
使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止;
设置一个sum_set来记录出现过的sum值;
每次getSum进行判断,如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false;
1.两数之和(e)
使用unordered_map数据结构,key为nums[i],value为i;
遍历一遍数组,寻找target-num[i]是否在map中;若有返回该map的索引和当前i,若没有,则在map中更新对应的key value;
454.四数相加Ⅱ(m)
首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数;
遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中;
定义int变量count,用来统计 a+b+c+d = 0 出现的次数;
在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来;
最后返回统计值 count 就可以了;
15.三数之和(m)
本题如果使用哈希会有许多去重的操作,不好写。
使用双指针法:
先将数组进行排序;
从头遍历一个数组选择第一个数i;left指针指向i后一位的数,right指针指向数组最后一位的数;
若i+left+right>0,则需要将三数之和缩小,此时需要将right向左移动一位;
若i+left+right<0,则需要将三数之和放大,此时需要将left向右移动一位;
直到三数之和等于0,然后对所有的组合进行去重;
最关键的是最后的去重!
i,left,right三种重复的情况
i重复的话判断相邻两位是否相等,若等于直接continue循环,进行i++;
left重复的话,比较left和left+1,直接left++;
right重复的话,比较right和right-1,直接right–;
18.四数之和(m)
核心思想和三数之和一样,都是双指针遍历;难的是去重和剪枝;