Day6-第三章哈希表

242.有效的字母异位词

题目链接242

题目简述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

思路

哈希映射

  • 首先判断两个字符串长度是否相等,不相等则直接返回 false
  • 若相等,则初始化 26 个字母哈希表,遍历字符串 s 和 t
  • s 负责在对应位置增加,t 负责在对应位置减少
  • 如果哈希表的值都为 0,则二者是字母异位词

题解

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        result = [0] *26
        if len(s) != len(t) :
            return False
        for i in s:
            result[ord(i) - ord("a")] += 1
        for i in t:
            result[ord(i) - ord("a")] -= 1
        for i in range(26):
            if result[i] != 0:
                return False
        return True

== 注 ==
时间复杂度o(n),空间复杂度o(1)

349.两个数组的交集

题目链接349

题目简述

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

思路

  • 创建Hash表
  • 若一个数组为空,则没有交集
  • 遍历数组1,加入hash表,数组中的数为key值
  • 遍历数组2,如果数组中的数在hash表中,加入结果数组

题解

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        if not nums1 or not nums2:
            return []
        #初始化哈希表(字典)
        hash = {}
        #初始化结果列表
        result = []
        #哈希表的key为nums1的数,value为值1
        for i in nums1:
            if not hash.get(i):
                hash[i] = 1
        #遍历nums2 ,如果nums2中的数在hash表中,加入结果数组,value值为0
        for i in nums2:
            if hash.get(i):
                result.append(i)
                hash[i] = 0
        return result

== 注 ==

  • 用字典创建hash表
  • dict.get()返回指定键的值,如果键不在字典中返回 default 设置的默认值
  • 本题解遍历了 nums1 和 nums2 数组,所以时间复杂度为 O(n + m),n 和 m 分别为两个数组的长度。
  • 额外建了一个哈希表,所以空间复杂度为 O(max(n, m))。

202.快乐数

题目链接202

题目简述

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
    如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

思路

  • 将当前数进行数位分离,求各位上平方的和。
  • 每次生成的数,查是否在哈希集合中,在的话就不是快乐数,不在的话就添到集合里。

题解

class Solution:
    #计算num每个位置上数字的平方和
    def getNext(self, num):
        happy_sum = 0
        #从个位开始
        while num:
            happy_sum += (num % 10) ** 2
            num = num // 10
        return happy_sum
    def isHappy(self, n: int) -> bool:
        record = set()
        while True:
            n = self.getNext(n)
            if n == 1:
                return True
            #如果替换后的数再出现,则进入无限循环
            if n in record:
                return False
            #未出现,加入记录集合
            else:
                record.add(n)

== 注 ==
求每个数位上的平方和时间复杂度为o(logn)
查询新元素是否在集合中时间复杂度为o(1)
总的时间复杂度为o(logn)
额外创建一个集合空间复杂度为o(logn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值