力扣-Hot100-哈希篇

144 阅读2分钟

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

注意这里求的是子序列、子序列、子序列

O(nlogn)O(nlogn)解法:将列表排序,每次哈希查看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

O(n)O(n)解法:对于一个升序的子序列,若首个元素为x,那么列表中一定不会存在x-1,所以我们直接对列表做去重,对于当前元素x,若不存在x-1,对x做递增操作,直到set中不存在x为止。

这种做法可以保证对于每个递增的子序列,只会遍历一次时间复杂度为O(n)O(n)

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