这个系列,主要就是利用go中的map来解
242 有效的字母异位词
题目:两个字符串,判断是否为异位词
解析:这道题肯定用map,只是里面的细节很多,比如要先判断两个字符串是否长度相等,不相等就直接返回了;然后对两个字符串分别用两个循环来处理,第二个减法的循环中,需要判断map中的值是否减到了1一下
349 两个数组的交集
题目:给两个数组,返回一个数组,里面是交集(没有重复元素)
解析:分别遍历,存进两个map里,然后用短的那个map再遍历,再第二个map中就追加到结果数组中即可
202 快乐数
题目:每一位的平方的加和,得出新的数,最后和为1就是快乐数,true or false
解析:本题没写太明白,要不就是为1,要不就是同一个数出现了两次,代表循环了;那么就可以用一个map[int]bool来判断是否出现过,注意要先写map,再重新计算数值,然后就废了
1 两数之和
题目:给一个数组,给一个目标值,返回一个数组,里面是符合的两个的下标
解析:还是用map,但因为要返回的是下标,就可以把下标存在value里,key里存数值
454 四数相加II
题目:四个数组,要求和为0,求有多少组
解析:两两个分成一组,每一组两层循环,key就是两个的和,value是出现的次数;一个加一个减
383 赎金信
题目:两个字符串a和b,判断a能不能由b里面的字符组成,一个字符只能用一次(01背包?)
解析:用map,把b的存进map,然后遍历a的时候,直接–,若小于0,那就是不能组成
15 三数之和
题目:一个数组,求三数之和为0,返回二维数组,且要子数组不重复
解析:这个压根不用哈希,用双指针+滑动窗口,写了好几次没写对,有如下点:
1.先判断边界条件,若数值小于3直接return空数组;
2.然后对数组进行排序,排序后遍历数组,对里面的数据再进行处理;
3.如果第一个数大于0,则再加上后面的两个(排序了),必然不会等于0,直接在循环里break;
4.如果当前数字等于上一个数字,也跳过(a重复),第一个数除外
5.若上面的都满足,那么滑动窗口为下一个位置到最后一个位置,再里面一个循环进行处理,三者之和大于0的话,right–;小于的话left++;等于的话,那就是先找到了一组合适的结果,然后再分别对b和c去重,最后对双指针两边同时收缩