当前位置: 首页 > news >正文

力扣1206--跳表

1206. 设计跳表 - 力扣(LeetCode)

挑战一下hard,果然难搞

参考 跳表的原理与实现 [图解]_跳表实现-CSDN博客

代码如下:

struct Node{Node(Node* _right, Node* _down, int _val) :right(_right), down(_down), val(_val){}Node* right;Node* down;int val;
};//Node节点的类型,一个右指针,一个向下的指针
class Skiplist {
private:Node* head;const static int max_Level = 32;//最大层数vector<Node*> pathList;//插入节点的时候,遍历查找小于target的最后一个Node,存在pathList中
public:Skiplist() {head = new Node(NULL, NULL, -1);//创建一个头结点进来pathList.reserve(max_Level);//使用reserve提前分配空间,每次都自动扩展32个}bool search(int target) {Node* p = head;while(p){while(p->right && p->right->val < target)p = p->right;if(!p->right || p->right->val > target)p = p->down;elsereturn true;}return false;}void add(int num) {Node* p = head;pathList.clear();while(p){//从左往右查找,直到不小于num为止while(p->right != NULL && p->right->val < num)p = p->right;pathList.push_back(p);p = p->down;/*//如果到达边界,往下一层找//这地方放在尾部主要是为了后边插入的时候,pop_back出来,//刚好是从最底层插入,然后再往上更新if(p->right != NULL && p->right->val > num){//如果右节点的值域大于num,那么把它放入list尾部pathList.push_back(p);//更新pp = p->down;}//if(p->right == nullptr)这里是个错误,上边if代码执行之后,会执行这个if//上述代码会改变p的值,所以这里不判断p值,直接访问p->right会导致指针越界//如果是其他情况,把当前的p放入list尾部else{pathList.push_back(p);p = p->down;}*/}//第一次把插入的flag置为true,从最底层开始,肯定是要插入的。bool insert_Up = true;Node* downNode = nullptr;//用于记录更新此次插入后的节点,如果上层需要插节点,用此更新while(insert_Up && pathList.size() > 0){Node* tmpNode = pathList.back();//拿到最后一个节点pathList.pop_back();//弹出//把新节点插入当前层//建立新节点,同时更新right和downNode* insert_Node = new Node(tmpNode->right, downNode, num);//把新节点插入层中tmpNode->right = insert_Node;insert_Up = (rand() & 1 ) == 0;//每次有50%的概率需要提取到上一层}//如果需要在最上一层加层if(insert_Up){//创建一个新Node,right为head,down为上次的downNodeNode* tmpNode = new Node(nullptr, nullptr, -1);tmpNode->right = head;tmpNode->down = downNode;//更新headhead = tmpNode;}}bool erase(int num) {Node* p = head;bool seen = false;while(p){while(p->right && p->right->val < num)p = p->right;if(!p->right || p->right->val > num)p = p->down;else{seen = true;p->right = p->right->right;p = p->down;//没有这一行也可以,有的话可以加快查询}}return seen;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 笔记-python里面的xlrd模块详解
  • linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本
  • Linux中git无法提交,出现不知道身份时的错误,无法检测到有效的电子邮件地址以关联代码的提交
  • 隧道代理是什么?怎么运作的?
  • 钡铼技术BL104在环境监测站多协议采集保障数据全面准确
  • mysql建立支持中文字符的库
  • sslyze一键检查服务器检查服务器的 SSL/TLS 安全性(KALI工具系列二十五)
  • Vue32-挂载流程
  • 一些常用的git指令总结
  • 7.无代码爬虫八爪鱼采集器软件——采集规则/项目的创建与网址输入
  • 推荐一个github项目
  • Pikachu靶场--文件包含
  • 解决使用Jmeter进行测试时出现“302“,‘‘401“等用户未登录的问题
  • Ubuntu修改MySQL的tmpdir参数失败的解决方法
  • C# —— 字典
  • 【comparator, comparable】小总结
  • JAVA之继承和多态
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • redis学习笔记(三):列表、集合、有序集合
  • springboot_database项目介绍
  • VUE es6技巧写法(持续更新中~~~)
  • Vue2 SSR 的优化之旅
  • 构建二叉树进行数值数组的去重及优化
  • 关于springcloud Gateway中的限流
  • 汉诺塔算法
  • 近期前端发展计划
  • 开源地图数据可视化库——mapnik
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 我有几个粽子,和一个故事
  • 进程与线程(三)——进程/线程间通信
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #NOIP 2014# day.2 T2 寻找道路
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (007)XHTML文档之标题——h1~h6
  • (11)MATLAB PCA+SVM 人脸识别
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)windows配置JDK环境
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (排序详解之 堆排序)
  • (十)T检验-第一部分
  • (万字长文)Spring的核心知识尽揽其中
  • (学习总结16)C++模版2
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net IE10 _doPostBack 未定义
  • .net Signalr 使用笔记
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET分布式缓存Memcached从入门到实战
  • .NET中winform传递参数至Url并获得返回值或文件
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法