1.哈希
1.1 两数之和
方法1:暴力解
使用暴力解思想,通过两个 for 循环拿下
代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
length = len(nums)
for i in range(length):
for j in range(i+1,length):
if nums[i]+nums[j] == target:
return [i,j]
return False
方法2:哈希表
以空间换时间:通过构建哈希表来实现快速查找
算法如下:
目标:找到两个数 a + b = target 等价变形:b = target - b
遍历到当前数字 num 的时候:
- 需要的另一半数字**:**need = target - num
- 去哈希表里查:need 之前有没有出现过?
- ✅存在:之前遍历的时候已经存过 need,那 need 的下标和当前 idx 就是答案,直接返回
- ❌不存在:把当前 num 和它的下标存入哈希表,继续往后遍历
1代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hash = {} # key:数组元素,value:元素对应的下标
for idx, num in enumerate(nums): # 遍历数组,获取下标和元素
need = target - num # 我们需要找的另一半数字
if need in hash:
# 哈希表里找到了另一半,直接返回两个下标
return [hash[need], idx]
# 没找到,就把当前数字存入哈希表,留给后面的元素配对
hash[num] = idx
return []
1.enumerate()函数详解
enumerate():是 Python 内置函数,作用是:同时拿到可迭代对象的 索引+元素
语法:
enumerate(可迭代对象, start=0)
- 返回值:
- 索引(默认从0开始)
- 索引指向的元素
- start:可选,下标起始数字
1.2 字母异位词分组
思想:互为字母异位词的字符串,**按字母顺序排序之后得到的字符串一定完全相同;**例:
eat→ 排序:aettea→ 排序:aetate→ 排序:aet
所以:排序后的字符串,作为哈希表的 key;哈希表 value 存原始字符串列表; key 相同的原始字符串,就是同一组字母异位词。
代码如下:1.
#1.导入collections模块
import collections
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
#2. 定义特殊字典
mp = collections.defaultdict(list)
#3. 遍历字符串列表
for st in strs:
#3.1 获得重排序后的字符串
key = "".join(sorted(st))
#3.2 原字符串追加
mp[key].append(st)
# mp.values() 取出所有分组的列表,转成list返回
return list(mp.values())
1.collections.defaultdict()详解
defaultdict :Python collections 模块提供的字典子类
defaultdict字典子类的特殊性: 普通字典访问不存在的键会抛出 KeyError; defaultdict 在读取不存在的 key 时,会自动调用传入的工厂函数,生成一个默认值赋值给这个 key
工厂函数:
list/int/str/set这类,不带参数调用就能生成对象
语法如下:
from collections import defaultdict
d = defaultdict(工厂函数)
2.sorted()函数详解
sorted() : Python 内置全局函数; 作用:对可迭代对象排序,返回新的列表,不会修改原对象
注意:字符串 st 属于可迭代对象,sorted(st) 会把字符串拆成单个字符,按 Unicode 编码从小到大排序
语法如下:
st = "tea"
res = sorted(st)
print(res)
# 输出:['a', 'e', 't']
3.join()函数详解
join() :**字符串的实例方法;**作用:将一个可迭代对象里的全部字符串元素,用调用者字符串作为分隔符拼接成一个新字符串
语法如下:
separator.join(iterable)
- separator:分隔符 (字符串,可以是空串
""、逗号","、横杠"-"等) - iterator:可迭代对象 (列表、元组、集合、生成器等),里面每一项都必须是字符串
- 返回值 :拼接完成的新字符串