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)

核心思想和三数之和一样,都是双指针遍历;难的是去重和剪枝;