力扣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;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运营一个商城网站需要办理什么许可证?

搭建一个商城网站以下资质是必须要办理的&#xff1a;网站ICP备案以及增值电信业务经营许可证。 一、网站ICP备案 国家对提供互联网信息服务的ICP实行许可证制度。从而&#xff0c;ICP证成为网络经营的许可证&#xff0c;经营性网站必须办理ICP证&#xff0c;否则就属于非法经营…

[python日常]获取指定文件夹下,指定后缀的文件

要读取指定路径下所有以.mp3为后缀的文件名&#xff0c;并将它们存储在一个列表中 关键代码&#xff1a; os.path.splitext(“文件路径”) 分离文件名与扩展名&#xff1b;默认返回(fname,fextension)元组&#xff0c;可做分片操作filename.endswith(.mp3) 使用os.listdir…

做好六西格玛项目,效率翻倍不是事!——张驰咨询

六西格玛作为一种数据驱动、客户为中心的持续改进方法&#xff0c;旨在通过减少过程变异和缺陷&#xff0c;提升业务效率和产品质量。以下是六西格玛项目执行的专业流程&#xff1a; 1. 定义阶段&#xff08;Define&#xff09; 识别机会&#xff1a;明确项目范围和目标&#…

Stable Diffusion 3 Medium 正式开源,用户对此产品评价如何?

前两天 Stability.AI 终于开源了 Stable Diffusion 3&#xff0c;虽然只是中杯的 Medium 版本&#xff0c;没有放出当初宣布的 8B 版本[1]&#xff0c;但也在很多方面取得了进步。本想第一时间尝鲜测试&#xff0c;但这几天出差在外&#xff0c;使用颇不方便。 正好老朋友揽睿…

Web前端三大主流框架详解及应用

在现代Web开发中&#xff0c;前端框架的选择对于项目的成功至关重要。本文将介绍目前最流行的三大前端框架&#xff1a;Vue.js、React和Angular&#xff0c;分析它们的特点、优势以及如何在实际项目中应用。 1. Vue.js Vue.js 是一款轻量级、高效的前端框架&#xff0c;由尤雨…

【大分享05】动态容差归档,打通不动产登记管理“最后一公里”

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自上海涵妍档案信息技术有限责任公司&#xff0c;作者&#xff1a;陈雪。 一、政策背景 在“互联网政务服务”的浪潮下&#xff0c;各级政府机构…

镭眸T51三维深度成像激光雷达为移动叉车导航及避障保驾护航

如今&#xff0c;移动叉车在智慧工厂里应用非常广泛&#xff0c;因此移动叉车如何做到准确导航及精准避障显得至关重要&#xff01;镭眸 T51 三维深度成像激光雷达为移动叉车的导航及避障提供了解决方案&#xff01; 镭眸 T51 三维深度成像激光雷达具有高精度、自适应自动曝光、…

ChatGPT原理及其应用场景

ChatGPT的原理及应用场景 一、ChatGPT的原理 ChatGPT&#xff0c;全名Chat Generative Pre-trained Transformer&#xff0c;是OpenAI研发的一款聊天机器人程序&#xff0c;其背后依托的是人工智能技术和自然语言处理&#xff08;NLP&#xff09;的深厚功底。其工作原理可以从…

如何使用ChatGPT等大模型翻译视频?2024最新翻译技巧分享

随着全球化的浪潮&#xff0c;跨语言沟通的需求日益增长。视频&#xff0c;作为一种生动直观的表达方式&#xff0c;也越来越需要跨越语言的障碍&#xff0c;触达更广泛的受众。因此&#xff0c;视频翻译成为了一个重要的领域&#xff0c;为不同语言背景的人们打开了理解彼此、…

MyBatis Plus Generator代码生成

一、MyBatis Plus Generator MyBatis Plus是一个功能强大的持久层框架&#xff0c;它简化了MyBatis的使用&#xff0c;提供了许多便捷的功能。其中&#xff0c;MyBatis Plus Generator是一个强大的代码生成器&#xff0c;可以帮助我们快速地根据数据库表结构生成对应的实体类、…

C语言中的预处理指令(如#include, #define等)是什么

C语言中的预处理指令是特殊的命令&#xff0c;它们在编译程序的实际编译阶段之前由预处理器&#xff08;preprocessor&#xff09;处理。这些指令用于在编译之前修改源代码&#xff0c;例如包含其他文件、定义常量或宏等。以下是C语言中常见的预处理指令&#xff1a; #include&…

Java基础-案例练习-全是干货

目录 案例&#xff1a;卖飞机票 案例&#xff1a;找质数&#xff1a; 案例&#xff1a;开发验证码 案例&#xff1a;评委打分 案例&#xff1a;卖飞机票 package anlixunlian;import java.util.Scanner;/*机票价格按照淡季旺季、头等舱和经济舱收费、 输入机票原价、月份和…

使用Ollama+OpenWebUI本地部署阿里通义千问Qwen2 AI大模型

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月17日22点50分 &#x1f004;️文章质量&#xff…

探索设计模式——单例模式详解

前言&#xff1a;设计模式的作用主要是为了——利用设计方式的重用来自动地提高代码的重新利用、提高代码的灵活性、节省时间&#xff0c; 提高开发效率、低耦合&#xff0c;封装特性显著&#xff0c; 接口预留有利于扩展。 设计模式的种类有很多种&#xff0c;本篇内容主要讲解…

Git Stash的使用和进阶

git stash 是Git中一个非常实用的命令&#xff0c;它能帮助你暂时存储工作目录和索引&#xff08;也就是暂存区&#xff09;中的改动&#xff0c;从而让你可以轻松地切换到一个干净的工作状态&#xff0c;而不会丢失当前的进度。下面是关于git stash的一些基本用法和相关命令&a…

计算机网络5:运输层

概述 进程间基于网络的通信 计算机网络中实际进行通信的真正实体&#xff0c;是位于通信两端主机中的进程。 如何为运行在不同主机上的应用进程提供直接的逻辑通信服务&#xff0c;就是运输层的主要任务。运输层协议又称为端到端协议。 运输层向应用层实体屏蔽了下面网络核心…

【机器学习】机器学习重要分支——集成学习:理论、算法与实践

文章目录 引言第一章 集成学习的基本概念1.1 什么是集成学习1.2 集成学习的类型1.3 集成学习的优势 第二章 集成学习的核心算法2.1 Bagging方法2.2 Boosting方法2.3 Stacking方法 第三章 集成学习的应用实例3.1 图像分类3.2 文本分类 第四章 集成学习的未来发展与挑战4.1 模型多…

【前端项目笔记】2 主页布局

主页布局 element-ui提供的组件名称就是它的类名 ☆☆ CSS选择器&#xff1a; &#xff08;1&#xff09;基本选择器 类型选择器 p/span/div…… 类选择器 (.classname) ID选择器 (#idname) 通配选择器 ( * ) &#xff08;2&#xff09;属性选择器 选择具有特定属性或属性值的…

编程猫对孩子有什么用处:探索编程教育的多元价值

编程猫对孩子有什么用处&#xff1a;探索编程教育的多元价值 在数字化浪潮席卷全球的今天&#xff0c;编程教育逐渐成为了孩子们成长道路上不可或缺的一部分。编程猫&#xff0c;作为专注于儿童编程教育的品牌&#xff0c;以其独特的教学方式和丰富的教学内容&#xff0c;深受…

【C语言】解决C语言报错:Uninitialized Variable

文章目录 简介什么是Uninitialized VariableUninitialized Variable的常见原因如何检测和调试Uninitialized Variable解决Uninitialized Variable的最佳实践详细实例解析示例1&#xff1a;局部变量未初始化示例2&#xff1a;数组未初始化示例3&#xff1a;指针未初始化示例4&am…