Hash
1. 两数之和
- 🔑🔑 难度:Medium 中等
示例1: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:
nums = [2,7,11,15]
,target = 9
输出:
[0,1]
解释:因为
nums[0] + nums[1] == 9
,返回[0, 1]
。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
record = dict()
for idx, num in enumerate(nums):
if target - num in record:
return [idx, record[target - num]]
if num not in record:
record[num] = idx
非常简单,记录每个数字下标就行了。
49. 字母异位词分组
- 🔑🔑 难度:Medium 中等
示例1:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入:
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[["bat"],["nat","tan"],["ate","eat","tea"]]
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
record = dict()
for cur_str in strs:
key_ = "".join(sorted(cur_str))
if key_ in record:
record[key_].append(cur_str)
else:
record[key_] = [cur_str ]
result = []
for k, v in record.items():
result.append(v)
return result
128. 最长连续序列
- 🔑🔑 难度:Medium 中等
示例1: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:
nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是
[1, 2, 3, 4]
。它的长度为4
。
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
res = 0
set_nums = set(nums)
for num in set_nums:
if num - 1 not in set_nums:
cur_num = num
curr_len = 1
while cur_num + 1 in set_nums:
cur_num += 1
curr_len += 1
res = max(res, curr_len)
return res
不需要排序,从集合中开始iter,如果遇到一个数字,在集合中不存在更小的值了,说明可以作为一个起点,那么直接开始iter,如果存在更小的值,那么不往前走。