将三数和,转换成n个两数和问题求解。时间O(n^2), 空间O(n)。
以排序后的元组作为集合元素,自带去重效果。
用取值的剩余次数来避免重复取值,和避免多次出现的值的漏选。
class Solution:
def threeSum(self , num: List[int]) -> List[List[int]]:
h_num = {} # 构建哈希表,键为数值,值为数值出现的次数
for n in num:
if not h_num.get(n):
h_num[n] = 1
else:
h_num[n] += 1
# 用集合存结果,可以去重
h_result = set()
# 转换成两数和问题求解
for a in h_num: # 在a已知时,b+c = -a 为两数和问题
h_num[a] -= 1 # 取了一个为a,该值次数减少一个,避免后面重复取值
for b in h_num:
if h_num[b] >0: # 如果该数在上一层没有被取或者没有被取完,则取为b
h_num[b] -= 1 # 取了一个为b,该值次数减少一个,避免后面重复取值
if h_num.get(-a-b): # 检查c=-a-b是否在哈希表内
if h_num[-a-b]>0: # 如果该数在上一层没有被取或者没有被取完,则取为c
# 排序后以元组的形式存入集合中,自带去重效果
h_result.add(tuple(sorted([a, b, -a-b])))
h_num[b] += 1 # 在下一轮取值前,恢复原状
h_num[a] += 1 # 在下一轮取值前,恢复原状
# 由于a,b,c的任意性,存下的结果就是最终结果
return [list(res) for res in h_result]

京公网安备 11010502036488号