01-Hash
📅 发表于 2026/04/02
🔄 更新于 2026/04/02
👁️ -- 次访问
📝 0 字
⏳ 0 分钟
hash
#两数之和
#字母异位词
#最长连续序列
#补数hash查找法
#排序遍历
#起点判断
数组nums和目标值target,求解和为target的两个整数下标。暴力法:依次遍历
补数Hash查找法
hash存储已遍历数字位置;求解当前数的补数;如果补数已遍历,则成功;如果没遍历,则存储。字符相同 (字母异位词)的字符串,构建list元素,字符串生成key做分组
字符串,生成一个key,按key分组。key:直接字符串排序即可。最长的 连续数字序列长度。排序遍历判断数字连续法
从小到大排序,再依次遍历,数组去重判断起点往后找法
数组去重,构建元素集合判断当前num是否为起点: 子循环,继续找后面的数,更新长度;def twoSum_loop(self, nums: List[int], target: int) -> List[int]:
""" 暴力解法
"""
for i, a in enumerate(nums):
# 注意遍历
for j in range(i+1, len(nums)):
b = nums[j]
if a + b == target:
return [i, j]
return [0, 1]数字num,计算求和为target的补数当前位置和补数位置即可。存储当前数字def twoSum_hash(self, nums: List[int], target: int) -> List[int]:
""" 记录已遍历的数字,循环数字,查看需要的是否存在
"""
# 1. 已经遍历过数字的位置
num2index = {}
for index, num in enumerate(nums):
# 2. 固定当前数字,需要的另一个数字
complement = target - num
if complement in num2index:
# 存在则返回
return [index, num2index[complement]]
else:
# 不存在,则存入当前num
num2index[num] = index
return [0, 1]"abc", "cba"], ["aaa"]]字母异位字符串
abc和cba为异位词,aaa和abc 则不是。相关题目
每个字符串,生成一个key,按key分组。字符排序,从小到大。保证 abc 和 cba 的key相同即可。def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
"""排序后的字符串是一样的,作为hash表的key,把key相同的字符串放在一起
"""
group_list = []
# 字符串key
key2strs = {}
for raw_str in strs:
# 注意这个sorted方法,直接可以对字符串做排序,返回char str数组
sorted_chars = sorted(raw_str)
key = "".join(sorted_chars)
if key not in key2strs:
key2strs[key] = []
key2strs[key].append(raw_str)
for key, str_list in key2strs.items():
group_list.append(str_list)
return group_list整数数组最长连续序列的长度。[1,2,3,4],输出4整数连续对数组进行排序当前数字是否和上一个数连续,相差为1; 长度+1长度清0,更新最大长度def longestConsecutive_sort(self, nums: List[int]) -> int:
if len(nums) < 2:
return len(nums)
# sorted_nums = sorted(nums)
# 对nums做排序
nums.sort()
max_length = 1
cur_length = 1
for i in range(1, len(nums)):
# 两个数相同,则跳过
if nums[i] == nums[i-1]:
continue
# 当前数和上一个数连续,就继续+1
if nums[i] == nums[i-1] + 1:
cur_length += 1
else:
# 当前数和上一个数不连续
max_length = max(cur_length, max_length)
cur_length = 1
max_length = max(cur_length, max_length)
return max_length数字去重,存入hash表。找序列的起点,遍历每个num,判断其是否为起点。 num-1不存在,则num为起点。 开启子循环,从num开始往后数(num+1, num+2, ..)更新最大长度num-1存在,则num不是起点,跳过num,等到真正的起点再开始找。def longestConsecutive_hash(self, nums: List[int]) -> int:
""" 做hash,循环nums,判读num是否为起点,若为起点再开始往后找
"""
if not nums:
return 0
# 1. 数组去重,做hash,方便判断是否存在
num_set = set(nums)
max_length = 1
# 2. 循环判断num,是否为起点
for num in num_set:
if num-1 in num_set:
# num 不为起点,跳过
continue
else:
# 3. num为起点,单开子循环,继续往后找
next_num = num + 1
cur_length = 1
# 一直往后找
while next_num in num_set:
next_num += 1
cur_length += 1
max_length = max(max_length, cur_length)
return max_length