[Leetcode] [Tutorial] 哈希


128. 最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

Solution

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        num_set = set(nums)  # 使用set更合适
        longest_streak = 0

        for num in num_set:
            if num - 1 not in num_set:
                streak = 1
                while num + 1 in num_set:
                    streak += 1
                    num += 1
                longest_streak = max(longest_streak, streak)

        return longest_streak

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

示例:
输入:nums = [3,2,4], target = 6
输出:[1,2]

Solution

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {
    
    }
        for i, num in enumerate(nums):
            if target - num in dic:
                return [dic[target - num], i]
            dic[num] = i
        return []

49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

Solution

为了确保每一个异位词都有相同的元组表示,我们可以确保每一个字符串都是字母序排列的,然后使用这个排序后的字符串作为哈希映射的键。

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        anagrams = defaultdict(list)
        for s in strs:
            # 对每个字符串的字符进行排序,然后将其作为键
            sorted_s = "".join(sorted(s))
            # 将原始字符串添加到对应的列表中
            anagrams[sorted_s].append(s)
        # 将字典中的所有值(即每个列表)添加到一个结果列表中
        return list(anagrams.values())

Python的字典不允许使用可变对象(如列表)作为键。你可以将排序后的列表转换为字符串,然后将这个字符串作为字典的键。你可以通过使用join方法来做到这一点。

如果你试图访问字典中不存在的键,Python会引发一个KeyError异常。你可以使用defaultdict来避免这个问题,或者在添加元素之前检查键是否存在。

此外,还需要注意的是,Python中的字典的values()方法返回的是一个dict_values对象,这不是一个列表,而是一个迭代器。为了满足返回类型的要求,需要将它转换为一个列表。你可以通过使用list()函数来实现这一点。

如果你希望使用 Counter 对象,如果你直接使用 tuple(Counter(char)),你实际上得到的是一个包含字典的键的元组。这会导致一个问题,比如对于 “boo” 和 “bob” 这两个字符串,你会得到相同的键 (b, o),即使它们不是字母异位词。在转换成元组时,你应该确保键是一致的,而不是依赖字母的出现顺序。

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        res = {
    
    }
        for char in strs:
            key = tuple(sorted((ch, freq) for ch, freq in Counter(char).items()))
            if key not in res:
                res[key] = [char]
            else:
                res[key].append(char)
        return list(res.values())

猜你喜欢

转载自blog.csdn.net/weixin_45427144/article/details/131257678