点击上方蓝字设为星标
每周一、三、五上午 8:30 准时推送
下面开始今天的学习~
前言
查找,是使用计算机处理问题时的一个最基本的任务,因此也是算法面试中非常常见的一类问题。很多算法问题的本质,就是要能够高效使用查找。LeetCode 中有很多问题都会用到集合和字典(C++ 中为 set 和 map , Python 中为 set 和 dict) 这两种数据结构,今天我们将会对 LeetCode 这类问题进行总结,所有代码采用 Python 实现,并可以在 力扣(LeetCode)里 AC。
灵活选择键值
454. 四数相加 II
题目描述
给定四个包含整数的数组列表 A,B,C,D,计算有多少个元组(i,j,k,l),使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A,B,C,D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。
例如:
解题思路
暴力解法,时间复杂度 O(n^4)
将 D 中的元素放入查找表,时间复杂度 O(n^3)
将 A + B 的每一种可能放入查找表,然后 两重循环对在查找表中寻找是否存在 -(C[i] + D[i]),时间复杂度为 O(n^2)。两数相加的和作为键值
我采用第三种方法实现
代码实现
49. 字母异位词分组
题目描述
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
解题思路
对字符串数组中每一个字符串进行排序,之后如果遇到相等的字符串,就说明该字符串对应的排序前的字符串是字母易位词。找字母易位词的过程用哈希表,每当出现一个新的字母易位词,就往 ret 中添加一个 list,同时往哈希表中添加该字母易位词,并将该字母易位词在哈希表中的 value 值存成该 list 的索引值;出现哈希表中已经存在的字母易位词,直接往对应索引的 list 中添加即可。排序后的字符串作为键值
代码实现
447. 回旋镖的数量
题目描述
给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k),其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。
找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。
示例:
解题思路
暴力解法:三重循环枚举所有的可能性。 时间复杂度为:O(n^3)
使用查找表:观察到 i 是一个 “枢纽”,对于每个点i,遍历其余点到i的距离 对于每个枢纽 i,计算它到其它点j的距离,并将距离作为键存入字典 dict 中,value 为距离的个数。时间复杂度为:O(n^2)。 距离作为键值
代码实现
149. 直线上最多的点数
题目描述
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
解题思路
两点可以确定一条直线,那么选择固定一个点,求其他点与固定点的斜率,如果斜率相同,那么斜率相同的点在同一条直线上。同时要考虑,斜率可能为无穷大,也有可能两个点为同一个点。键值应该为:斜率。
代码实现
查找表和滑动窗口
219. 存在重复元素 II
题目描述
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
解题思路
结合使用滑动窗口和查找表,不断查找当前滑动窗口内有没有重复值。我们通过建立一个 record 查找表,表中存的是窗口中的数,另外我们要注意的是,当窗口的大小>k的时候,我们要移除 record 中最左边的元素(保证我们窗口中有 <= k 个数)
代码实现
220. 存在重复元素 III
题目描述
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums[i] 和 nums[j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。
解题思路
也是查找表与滑动窗口的思路:维持滑动窗的大小最大为 k,遍历每一个元素 nums[i],在活动窗口中寻找 |one-nums[i]| < t,即窗口中的元素范围为:[one-t…one+t] 之间
代码实现
总结
我们知道在准备面试的时候,刷算法题是一种捷径,特别是刷力扣,但是不能一味的刷题,我们需要总结和思考,对于一些相似的题目我们应该多想想他们的思想,其实很多题的解题思路都是相近的。
本文作者:军旗
编辑&版式:霍霍
声明:本文归 “力扣” 版权所有,如需转载请联系。