基础算法——第四章总结

4-1 2
查找问题
1.查找有无 使用set,存储只有键
2.查找对应关系,键值对查找,使用map or 字典

set和map的操作:
insert
find
erase
change(map)

练习题 349 求两个数组的公共元素,重复的不算(用set)
练习题 350 求两个数组的交集,重复的要算(用map记录频次)
思考:如果两个数组本身有序,是否能利用。

4-3 4 5 6
set和map的时间复杂度和空间复杂度分析


基础算法——第四章总结

哈希表都是O(1)级别的,缺点是失去了数据的顺序性

和查找相关的问题
练习题242:判断字符串t是否是字符串s变换字符顺序后得到的结果
练习题202:happy number
练习题290:word pattern
练习题205:Isomorphic String
练习题451:Sort Characters By Frequency

一个实用查找表的经典问题:
练习题1:Two Sum
考虑的问题:
索引从0还是从1?没有解怎么办?多个解怎么办

思路一:暴力解法
思路二:排序后+指针对撞 O(nlogn)+O(n)=O(nlogn)
但是排序后索引就变了,需要处理
思路三:查找表。将当前查找的元素之前的数放入查找表,之后对于每个元素a,查找target-a是否存在。返回索引,要用map

练习题15:3Sum
练习题18:4Sum
练习题16:3Sum closest

练习题454:4Sum II
给出四个整型数组ABCD
各选出一个数,使他们的和为0
思路:把C和D两两相加,放入查找表中
遍历A和B的两两相加的数,在查找表中找到-A-B

练习题:49 Group Anagrams

练习题447:Number of Boomerangs
求一个三元组,第一个到第二个点的距离,和第一个和第三个点的距离相等


基础算法——第四章总结


基础算法——第四章总结

练习题149:Max Points on a line

4-7 8
练习题219:给定一个整型数组nums和一个整数k,是否存在i和j使得nums[i]==nums[j]且i和j的差值不超过k
思路:滑动窗口+查找表
因为i和j的差值不超过k,所以i和j始终在[l,l+k] 的区间之内。维护这个区间,来一个数看看这个区间中有没有和它相等的数,没有的话,窗口整体向右移动。


基础算法——第四章总结

练习题217

练习题220:给定一个整型数组nums,使得nums[i]与nums[j]之间的差别不超过给定的数字t,且i与j之间的差别不超过给定的数字k
思路:使用滑动窗口,维护长度为k的区间。在区间中寻找abs(nums[i]-nums[j])<=t


基础算法——第四章总结

if ceil(v-t)<=v+t,那么查找表中一定会出现一个元素和v的差是在t以内的。floor(v-t)>=v-t是一样的。