1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。
思路:哈希存储每个数字所在的位置,每次想要这个数字的时候,直接去拿就好了。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
mp = defaultdict(int)
for i, x in enumerate(nums):
t = target - x
if t in mp:
return [mp[t], i]
mp[x] = i
49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
由于字母的顺序不同,难点在于如何查询到已经保存了的异位词,这里采用转为字符列表,按照字典序排列作为key,保证可以每次都找到相同异位词。
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
res = []
n = len(strs)
mp = defaultdict(list)
for s in strs:
ss = list(s)
ss.sort()
ss = str(ss)
mp[ss].append(s)
for k in mp:
res.append(mp[k])
return res
128. 最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入: nums = [100,4,200,1,3,2]
输出: 4
解释: 最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入: nums = [0,3,7,2,5,8,4,6,0,1]
输出: 9
注意这里求的是子序列、子序列、子序列
解法:将列表排序,每次哈希查看x-1是否存在然后累加,求出最大长度。
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
nums.sort();
mp = defaultdict(int)
res = 0
for x in nums:
mp[x] = mp[x - 1] + 1
res = max(mp[x], res)
return res
解法:对于一个升序的子序列,若首个元素为x,那么列表中一定不会存在x-1,所以我们直接对列表做去重,对于当前元素x,若不存在x-1,对x做递增操作,直到set中不存在x为止。
这种做法可以保证对于每个递增的子序列,只会遍历一次时间复杂度为
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
mp = defaultdict(int)
se = set(nums)
res = 0
for x in nums:
maxv = 0
if x - 1 not in se:
while x in se:
maxv += 1
x += 1
res = max(res, maxv)
return res