Hash table

1.Hash Fucntion

1.1 直接定址法

1.2除留余数法

1.3平方取中法

1.4基数转换法

2.Hash Collision

2.1开放地址法

2.2链地址法

3.

1.0217. 存在重复元素

解法1:

使用dict,因为python中dict内部存储方法为hash table,本质为遍历,故时空复杂度均为O(n)。

解法2:

使用set。故时空复杂度均为O(n)。

解法3:

排序,由于Quick Sort 和 Merge Sort等最快排序算法时间复杂度均为nlog(n),遍历时间复杂度为O(n),故最终仍为O(nlog(n))。空间复杂度为O(1),因为空间复杂度计算的是额外需要的。

2.0219. 存在重复元素 II

1.0349. 两个数组的交集

解法1:

hash map

直接使用内置的intersection方法确实要慢一些。

解法2:

分离双指针。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        numlist = []
        nums1.sort()
        nums2.sort()
        i,j = 0,0
        while(1):
            if i == len(nums1) or j == len(nums2):
                break
            if nums1[i] == nums2[j]:
                numlist.append(nums1[i])
                i+=1
                j+=1
                continue
            if nums1[i] < nums2[j]:
                i+=1
                continue
            else:
                j+=1
                continue
            
        
        return list(set(numlist))
遍历一遍加原位操作,故时间复杂度O(n),空间复杂度O(1)。

2.0350. 两个数组的交集 II

3.0706. 设计哈希映射

真的不会,所以贴原答案,供接下来继续学习:

class MyHashMap:

    def __init__(self):
        self.buckets = 1003
        self.table = [[] for _ in range(self.buckets)]


    def hash(self, key):
        return key % self.buckets


    def put(self, key: int, value: int) -> None:
        hash_key = self.hash(key)
        for item in self.table[hash_key]:
            if key == item[0]:
                item[1] = value
                return
        self.table[hash_key].append([key, value])


    def get(self, key: int) -> int:
        hash_key = self.hash(key)
        for item in self.table[hash_key]:
            if key == item[0]:
                return item[1]
        return -1


    def remove(self, key: int) -> None:
        hash_key = self.hash(key)
        for i, item in enumerate(self.table[hash_key]):
            if key == item[0]:
                self.table[hash_key].pop(i)
                return

为计算一个列表中元素(也为列表)个数,使用dict比使用list要快得多:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值