• LeetCode每日一题——1206. 设计跳表


    题目

    不使用任何库函数,设计一个 跳表

    跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。

    例如,一个跳表包含 [30, 40, 50, 60, 70, 90] ,然后增加 80、45 到跳表中,以下图的方式操作:
    在这里插入图片描述

    Artyom Kalinin [CC BY-SA 3.0], via Wikimedia Commons

    跳表中有很多层,每一层是一个短的链表。在第一层的作用下,增加、删除和搜索操作的时间复杂度不超过 O(n)。跳表的每一个操作的平均时间复杂度是 O(log(n)),空间复杂度是 O(n)。

    了解更多 : https://en.wikipedia.org/wiki/Skip_list

    在本题中,你的设计应该要包含这些函数:

    • bool search(int target) : 返回target是否存在于跳表中。

    • void add(int num): 插入一个元素到跳表。

    • bool erase(int num): 在跳表中删除一个值,如果 num 不存在,直接返回false. 如果存在多个 num ,删除其中任意一个即可。
      注意,跳表中可能存在多个相同的值,你的代码需要处理这种情况。

    示例

    示例 1:

    输入

    [“Skiplist”, “add”, “add”, “add”, “search”, “add”, “search”, “erase”, “erase”, “search”]
    [[], [1], [2], [3], [0], [4], [1], [0], [1], [1]]

    输出

    [null, null, null, null, false, null, true, false, true, false]

    解释

    Skiplist skiplist = new Skiplist();
    skiplist.add(1);
    skiplist.add(2);
    skiplist.add(3);
    skiplist.search(0); // 返回 false
    skiplist.add(4);
    skiplist.search(1); // 返回 true
    skiplist.erase(0); // 返回 false,0 不在跳表中
    skiplist.erase(1); // 返回 true
    skiplist.search(1); // 返回 false,1 已被擦除

    提示:

    0 <= num, target <= 2 * 104
    调用search, add, erase操作次数不大于 5 * 104

    思路

    维持一个哈希表,键为要存储的值,值为要存储值的数量
    详细见代码

    题解

    class Skiplist:
        def __init__(self):
            # 维持哈希表
            self.temp = {}
        def search(self, target: int) -> bool:
            # 看target是否在哈希表的键中,或哈希表的值为0
            return target in self.temp.keys() and self.temp.get(target) >= 1
        def add(self, num: int) -> None:
            # 哈希表中存在,数量加一
            if num in self.temp.keys():
                self.temp[num] += 1
            else:
                # 哈希表中不存在,直接添加
                self.temp[num] = 1
        def erase(self, num: int) -> bool:
            # 检查num是否在哈希表的键中,或者数量已经减为零
            if num not in self.temp.keys() or self.temp.get(num) < 1:
                return False
            # 存在的情况,哈希表中对应的值减一
            self.temp[num] -= 1
            return True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    华为云数据库战略启示录
    Leetcode.215 数组中的第K个最大元素
    自动驾驶与人工驾驶并存,自动驾驶取代人工驾驶
    Volatile关键字的作用
    c++:力扣,最小栈
    使用自功率谱、互功率谱估计滤波器幅频特性
    20240309web前端_第四次作业_完成随机点名程序
    商业合作保密协议
    【升级U8+】为视图或函数 ‘Ap_DetailVend‘ 指定的列名比其定义中的列多。
    【笔试题】【day22】
  • 原文地址:https://blog.csdn.net/m0_52000372/article/details/125991353