python coding with ChatGPT 打卡第5天| 哈希表:有效字母异位词、两个数组的交集、快乐数、两数之和

系列文章
python coding with ChatGPT 打卡第1天| 二分查找、移除元素
python coding with ChatGPT 打卡第2天| 双指针、滑动窗口、螺旋矩阵
python coding with ChatGPT 打卡第3天| 移除链表、设计链表、反转链表
python coding with ChatGPT 打卡第4天| 链表其他操作:两两交换、删除倒数第N个节点 链表相交 环形链表

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

常见的三种哈希结构:

  • 数组
  • set(集合)
  • map(映射)

要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。
但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

有效的字母异位词

Key points

  1. 数组就是简单的哈希表,但是数组的大小可不是无限开辟的
  2. 需要定义一个多大的数组呢,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。

相关题目

242. 有效的字母异位词

视频讲解

哈希表数组

重点分析

def isAnagram(s, t):
    alpha_table =[0]*26

    for char in s:
        alpha_table[ord(char)-ord('a')] += 1

    for char in t:
        alpha_table[ord(char) - ord('a')] -= 1
    print(alpha_table)

    if all([x==0 for x in alpha_table]):
        return True

    return False

时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。

方法2:字符串排序

def isAnagram(s,t):

    if sorted(s) == sorted(t):
        return True

    return False

两个数组的交集

Key points

  1. 使用数组来做哈希的题目,是因为题目都限制了数值的大小。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
  2. 遇到哈希问题数组比set的优势:使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。
  3. 本题后面力扣改了题目描述和后台测试数据,增添了数值范围:
    1 <= nums1.length, nums2.length <= 1000
    0 <= nums1[i], nums2[i] <= 1000
    所以就可以 使用数组来做哈希表了, 因为数组都是 1000以内的。

相关题目

349. 两个数组的交集

视频讲解

set使用技巧

重点分析

def intersection(nums1, nums2):
    record = [0]*1001
    result = set()
    for i in nums1:
        record[i] = 1
    for i in nums2:
        if record[i] == 1:
            result.add(i)
    return list(result)

方法2:

def intersection(nums1, nums2):
	return list(set(nums1) & set(nums2))

快乐数

相关题目

202. 快乐数

重点分析

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        num_str = str(n)
        new_num_str = num_str
        seen = set()
        while new_num_str not in seen:
            seen.add(new_num_str)
            new_num = 0
            for char in new_num_str:
                new_num += int(char)*int(char)
            new_num_str = str(new_num)
            if new_num_str == '1':
                return True
        else:
            return False


两数之和

Key points

  1. 当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

相关题目

1. 两数之和

视频讲解

梦开始的地方

重点分析

暴力解法:

def twoSum(nums, target):
       for i in range(len(nums)):
           for j in range(i+1, len(nums)):
               if nums[i] + nums[j] == target:
                   return [i,j]

哈希法:

    record = dict()
    for i in range(len(nums)):
        i_target = target - nums[i]
        if i_target in record:
            return [i, record[i_target]]
        record[nums[i]] = i
时间复杂度: O(n)
空间复杂度: O(n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值