day06 第三章 哈希表part01

哈希表基础概念

定义:

哈希表是根据关键码的值而直接进行访问的数据结构。

用处:

一般哈希表都是用来快速判断一个元素是否出现集合里。

常见的三种哈希结构:
  • 数组
  • set (集合)
  • map(映射)
使用场景:

当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。

map也一样。

总结:

一种映射,能用数组用数组,最快。

242.有效的字母异位词

这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。

tips:

Pre-assign some space to the list in python before indexing.

Use ord() to convert a single character to its unicode code point.

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        hash_alphbet = [0] * 26 # pre-assign some space to the list
        for i in range(len(s)):
            hash_alphbet[ord(s[i])-ord('a')] += 1 # In Python, use ord() to convert a single character (like 'a') to its corresponding Unicode code point (an integer).

        
        for i in range(len(t)):
            hash_alphbet[ord(t[i])-ord('a')] -= 1

        for cnt in hash_alphbet:
            if cnt != 0:
                return False
        
        return True

349. 两个数组的交集

先确定要用什么数据类型

选择数组or集合:

数组:数据大小有一个范围,且不会太大,也不会有太多空

集合:数据稀疏;数据大小不定(由于要hash运算,耗时比数组长) 

set: 红黑树O(logn)

multiset: 红黑树O(logn)

unordered_set: 哈希表O(1)

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set_nums1 = set(nums1) # unordered_set
        result = set()
        for element in nums2:
            if element in set_nums1:
                result.add(element)

        return list(result)

1. 两数之和

为什么要用哈希法?

为什么使用map?

map是用来干(存)什么的?

map的value是存放什么的?

什么数据结构,具体用哪个,用来干什么,具体存什么

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        iterated = {}
        for i in range(len(nums)):
            if (target-nums[i]) in iterated:
                return [i, iterated[target-nums[i]]]
            else:
                iterated[nums[i]]=i
        
        return [] #list(iterated)

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值