【LeetCode链表#11】环形链表||(双指针)

环形链表II

力扣题目链接(opens new window)

题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

说明:不允许修改给定的链表。

循环链表

思路

首先,要明确题目需要什么

"给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null"

我们要做的不仅是判断链表是否有环,而是要返回链表开始入环的第一个节点

也就是链表环的起始位置(如示例1中的节点2)

那么解决问题的过程就分为两部分:判断是否存在环找到环的入口

判断环(双指针法)

可行性解释

判断是否存在环结构可以使用快慢指针实现

想象一下,如果链表中没有环,那么走在前面的快指针是不可能与慢指针相遇的(追不上)

反之,如果存在环结构,那么快指针在进入环结构之后会在环内不断循环,此时慢指针经过一段时间后也会进入环结构,最终被快指针追上,两者相遇,从而证明环的存在。

因此,快慢指针判断环是可行的。

快慢指针如何定义?

在说明可行性时,我们没有具体给出快慢指针要怎么定义

设定:快指针每次移动两个节点慢指针每次移动一个节点

为什么?

还是像之前说的,一定是快指针先进入环

当慢指针也进入环之后,就形成了快指针追慢指针这样一个情况

此时由于我们的设定,快指针相对于慢指针的移动速度是一个节点

也就是说,在环内,快指针以每次移动一个节点的速度去接近慢指针

因此最终快慢指针一定会相遇

141.环形链表

上述过程也解释了为什么不能把快指针的速度设置为3,因为这样两个指针在环内的相对移动速度就会变成2,快指针就有可能跳过慢指针导致两者不能相遇。

找到环的入口

设置变量

现在可以开始找环结构的入口

注意:这个才是题目的要求,而不是要你直接返回快慢指针在环内相遇时的位置

从快慢指针相遇这个时间节点开始分析,我们可以设出几个变量

img

设:

从头结点到环形入口节点的节点数为x;

环形入口节点到fast指针与slow指针相遇节点节点数为y;

从相遇节点再到环形入口节点节点数为z;

一些推导

可以用这些变量来描述快慢指针的行为:

快指针至少走过了x+y个节点,并且在环内转了 n 圈,即:
$$
fast = x+y+n(y+z)
$$
而慢指针从头节点开始到进入环并被快指针追上,经过的节点数就是x+y,即:
$$
slow=x+y
$$
因为快慢指针的移动速度是 2:1 ,因此可以得到以下等式:
$$
fast=2slow
$$

$$
x+y+n(y+z) = 2(x+y)
$$

经过化简可以得到:
$$
n(y+z) = x+y
$$

$$
x = n(y+z) - y
$$

在上述式子中,单看x和-y是没有什么关系的

因此,人为调整公式里的圈数n将负数转化掉来寻找规律(快指针在环内转几圈都是无所谓的,因此n是几可以按需调整)
$$
x = (n-1)(y+z)+ (y+z)- y
$$

$$
x = (n-1)(y+z)+z
$$

快指针在环内至少转一圈以后才会与慢指针相遇(快指针要在环里等慢指针,想想)

因此,n>=1

n=1 时,可以得到
$$
x = z
$$

结论

上面的推导只是为了得出寻找入口的方法

最后的结果非常关键,x = z 说明了:当快慢指针在环内相遇后,此时分别在相遇点和头节点处各设一个指针,那么这两个指针一定会在环的入口处相遇

由此我们便可以找到环的入口

n不等于1时成不成立呢?也是成立的

因为 n 代表的是快指针在环内经过的圈数,经过1圈在入口处相遇和经过10圈在入口处相遇没有区别,相遇的位置永远是要找的入口。(关键是 z 字段距离是多少)

代码

代码实现也是分为两部分

先使用快慢指针找到环结构,然后定义新的两个指针去找到环入口

public class Solution {
    public ListNode detectCycle(ListNode head) {
        //定义快慢指针
        ListNode fast = head;
        ListNode slow = head;
        //快指针只要没指向空就不断往后走
        while(fast != null && fast.next != null){//fast一次跳两步,因此还需要判断next
            fast = fast.next.next;
            slow = slow.next;
            //如果找到环
            if(fast == slow){
                //定义两个新的指针用来找入口
                ListNode crossIndex = fast;//等于slow也行,现在这俩一样
                ListNode headIndex = head;//位于头节点的新节点
                while(headIndex != crossIndex){
                    crossIndex = crossIndex.next;
                    headIndex = headIndex.next;
                }
                return crossIndex;//return谁都可以,这俩也一样现在
            }   
        }
        return null;    
    }
}
本文转载于网络 如有侵权请联系删除

相关文章

  • leetcode-485. 最大连续 1 的个数

    JAVA解法classSolution{ publicintfindMaxConsecutiveOnes(int[]nums){ //初始化最大值与计数值为0 intmaxCount=0,count=0; //获取数组长度 intn=nums.length; for(inti=0;i<n;i++){ //记录当前连续1的个数 if(nums[i]==1){ count++; }else{ //非1时记录值与当前最大值比较,比较大的作为最大值 maxCount=Math.max(maxCount,count); //恢复初始值 count=0; } } //循环结束返回最终的最大值 maxCount=Math.max(maxCount,count); returnmaxCount; } }复制题解分析首先初始化最大值与计数值为0,然后获取数组长度,遍历数组所有值,记录当前连续1的个数,直到遇到不是1,的值,非1时记录值与当前最大值比较,比较大的作为最大值,并恢复计数初始值,循环结束返回最终的最大值。leetcode原题:485.最大连续1的个数

  • 三维重建技术概述

    基于视觉的三维重建,指的是通过摄像机获取场景物体的数据图像,并对此图像进行分析处理,再结合计算机视觉知识推导出现实环境中物体的三维信息。1.相关概念(1)彩色图像与深度图像彩色图像也叫作RGB图像,R、G、B三个分量对应于红、绿、蓝三个通道的颜色,它们的叠加组成了图像像素的不同灰度级。RGB颜色空间是构成多彩现实世界的基础。深度图像又被称为距离图像,与灰度图像中像素点存储亮度值不同,其像素点存储的是该点到相机的距离,即深度值。图2-1表示深度图像与灰度图像之间的关系。 图2-1深度图像与灰度图像 Fig.2-1Thedepthimageandgrayimage深度值指的目标物体与测量器材之间的距离。由于深度值的大小只与距离有关,而与环境、光线、方向等因素无关,所以深度图像能够真实准确的体现景物的几何深度信息。通过建立物体的空间模型,能够为深层次的计算机视觉应用提供更坚实的基础。 图2-2人物的彩色图像与深度图像 Fig.2-2Colorimageanddepthimageofthecharacters(2)PCLPCL(PointCloudLibrary,点云库)是由斯坦福大学的Dr.

  • Docker 常用命令,五大部分,收藏!

    一、帮助命令docker--help复制二、进程相关命令启动Docker服务systemctlstartdocker复制停止docker服务systemctlstopdocker复制重启docker服务systemctlrestartdocker复制查看docker服务状态systemctlstatusdocker复制开机启动docker服务systemctlenabledocker复制三、镜像相关命令查看镜像#查看镜像的全部信息 dockerimages #查看所用镜像的id dockerimages–q复制搜索镜像#搜索镜像 dockersearch镜像名称 #如:搜索redis镜像 dockersearchredis复制拉取镜像#拉取最新的镜像 dockerpull镜像名称 #拉取指定版本的镜像 dockerpull镜像名称:版本号复制删除镜像#删除指定本地镜像 dockerrmi镜像id #删除所有本地镜像(一般都不用改命令) dockerrmi`dockerimages-q`复制四、容器相关命令查看容器#查看正在运行的容器 dockerps #查看所有容器 dock

  • 《2021上半年全球DDoS威胁报告》发布,DDoS攻击次数连续四年高速增长

    DDoS攻击作为一种常见的网络安全攻击方式,因“产业”链条成熟、手段原始粗暴、成本低回报高,一直以来都被视为互联网的最大“毒瘤”之一。在云计算等新技术的快速发展,以及网络场景和规模不断扩大的趋势之下,DDoS攻击也呈现出愈演愈烈之势。腾讯安全联合绿盟科技发布《2021上半年全球DDoS威胁报告》,基于对2021上半年监测到的数据情况进行统计分析,全面盘点了过去半年中DDoS攻击的发展态势。《报告》指出,在疫情影响下,各类企业业务持续线上迁移,DDoS攻击次数已连续4年高速增长,且量级强度、手段方式、攻击来源相较以往都有明显的升级变化。针对越发复杂的网络安全环境,《报告》还结合实际案例为企业DDoS攻击防护提供了实用性建议。 一图了解DDoS威胁七大趋势?关注腾讯安全(公众号TXAQ2019)回复DDoS威胁报告获取原报告黑产猖獗,DDoS攻击次数保持高度攀升后疫情时代,数字技术正在加速与实体经济融合,大量经济活力持续向线上迁移,游戏、直播、电商、线上教育等行业繁荣发展,引来黑产团伙觊觎。在这背景下,DDoS攻击次数连续四年呈现高速增长的趋势,并且这一趋势在中国以外的其他国家区域更为明显

  • EasyCVR级联上级平台请求接口失败排查(EasyCVR三种ID说明)

    EasyCVR能够对上级平台进行级联,包括国标GB28181协议设备以及RTSP协议设备。在我们做EasyCVR测试时,发现数据通道通过上级平台添加到EasyGBS出现播放的问题,前端播放器一直在转圈,无法播放,过一会请求接口失败,前端控制台会出现错误。在前端控制台分析接口的结构中serial和code是一样的,最终在浏览器打开播放视频出现400错误码;400的错误码是客户端错误(例如,格式错误和请求语法错误等等各种问题),导致服务器不能活着,不会处理客户端请求。但是在设备管理中点击其他的播放视频都是可以播放的,所以还是填写的数据格式有错误,才导致找不到这个流。在EasyCVR代码中有三种id,其中ParentID和DeviceID是相对应的,ID是单独这个数据id。以下两张图都是ParentID赋值了ChannelID,再进行保存临时数据,并发送给前端的ID数据。解决这个问题,我们需要修改里面的ParentID和DeviceID,把ParentID改为DeviceID,也就是设备的id,这样请求接口就会找到某个设备的编号,也就是标识。获取标识之后,视频就可以正常播放了。

  • kali操作系统虚拟机安装

    虚拟机搭建物理机要求:I3同级或者更高级内存不小于2G(最低要求)8G略显紧凑16G上天。。硬盘只是玩玩的话用32G左右就好长期玩不小于80G关于树莓派的使用树莓派是轻量级的工具可以充当服务器使用但是承载能力有限,不适合大型运算的软件可以安装msfconsoleettercap相互配合达到内网渗透的效果树莓派3某宝报价230加上3.5寸屏幕60树莓派蓝牙键盘60SD卡60(32g)充电宝100(要求稳定输出且有两个USB接口)以上为大概报价推荐搭配路由器使用例如小米青春版路由器极路由等(因为这种路由器第一有防火墙可以自己配置在者因为miniusb供电接口可以用充电宝带动)此外如果去要渗透无线WIFI需要使用3070,8187芯片的网卡价格不同覆盖效果不同两种型号的芯片各有优缺点自行斟酌Linux开机自启动方法(系统开启完毕未登录时)http://zhidao.baidu.com/link?url=e5pb8K1FTXdT_wMVUOBdeED-l5CfxNQ7Hyo4SPBJ7q3B7dGsk0_gjc8LEM9u1FWoAQMCCfAYRZOcZXeo3EwkjBMVKWgEqdbA

  • (译)Cloudflare 的部署失误导致了全球故障

    这篇博客是个占位符,后续会用完整的检验报告进行替换,来披露今天的发生的问题。今天有大概30分钟,Cloudflare网站的浏览者收到了502错误,起因是我们网络中的CPU使用率飙升。这个CPU的峰值是由一个错误的软件部署造成的,这一错误已经回滚,回滚后,服务恢复正常,Cloudflare返回到了正常的通信水平。这并不是一次攻击(有人如此猜测),我们对此事故深表抱歉。我们正在开会和编写完整的调查报告来理解问题的来龙去脉,并在未来防止同类问题的再次发生。UTC2009更新在今天的UTC1342,我们经历了一次全网范围内的故障,所有访问被Cloudflare代理的域都显示502错误(“BadGateway”)。在一次Cloudflare防火墙(WAF)规则的例行部署中,一条配置错误的规则引发了这次问题。这个新规则的作用是屏蔽一条用于攻击的inlineJavaScript。这些规则用一种虚拟方式进行部署,这样一来新规则会识别问题并进行记录,但不会阻断用户的流量,这样我们就可以对误报率进行测量,以保障新规则进行全面生产部署时不会出现问题。不幸的是,这些规则中有一条包含了一个正则表达式,导致CPU

  • [c#基础]关于const和readonly常见的笔试题剖析

    引言 有那么几天没更新博客了,发现到了不得不写的地步,总是有那么个声音在强迫自己,虽然工作很累,但是有些东西不写出来,不能原谅自己。今天为什么总结这两个关键字的区别,总觉得这两个关键字的用法用的太习惯了,没想过为什么这么用,就好比为什么一直用右手拿筷子,这么习惯。为什么我要用右手拿筷子,为什么不用左手呢?突然你就这么干了,发现你和周边很不协调,而且还夹不了菜。const和readonly也一样,习惯了,一直这样用,也就没追究过。突然被那么一问,还真说不出来个一二,今天就细细的研究下,到底这东东是啥玩意儿?网上虽然很多这方面的内容,虽然也看过,但是那毕竟是别人总结的,自己没动手实践一下,就觉得那不是自己的。实践才能记得更深刻,理解的更深。 常量 静态常量:指编译器在编译时会对常量进行解析,并将常量的值替换成初始化的那个值。 动态常量:在运行的那一刻获取值,编译器编译期间将其标识为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。 readonly和const const修饰的常量为静态常量,而readonly修饰的常量为动态常量。 如何区别

  • Encoder-Decoder、Seq2Seq、Attention

    Encoder-Decoder、Seq2Seq、Attention 传送门1:Encoder-Decoder和Seq2Seq 因为注意力不集中,所以这篇随笔就是看别人的文章,随手参考写写的。   1.Encoder-Decoder Encoder-Decoder模型并不特指某种具体算法,而是一种通用的框架,这个框架下可以使用不同的算法来解决不同的任务。 Encoder-Decoder框架诠释了机器学习的核心思路:将现实问题转化为数学问题,通过求解数学问题,从而解决现实问题。   Encoder又称为编码器,作用就是:将现实问题转化为数学问题。 将文字/图片/音频等作为输入,通过Encoder编码器,输出向量。   Decoder又称为解码器,作用就是:求解数学问题,并转化为现实世界的解决方案。 将向量作为输入,通过Decoder解码器,输出文字等。   结合起来就是:Encoder将现实世界的问题转化成向量C,然后传给Decoder,Decoder通过向量,求解数学问题,然后转化为现实世界的解决方案。 其中2点注意: 1.无论输入和输出的长度是什

  • 看过这篇剖析,你还不懂 Go sync.Map 吗?

    hi,大家好,我是haohongfan。 本篇文章会从使用方式和原码角度剖析sync.Map。不过不管是日常开发还是开源项目中,好像sync.Map并没有得到很好的利用,大家还是习惯使用Mutex+Map来使用。 下面这段代码,看起来很有道理,其实是用错了(背景:并发场景中获取注册信息)。 instance,ok:=instanceMap[name] ifok{ returninstance,nil } initLock.Lock() deferinitLock.Unlock() //doublecheck instance,ok=instanceMap[name] ifok{ returninstance,nil } 复制 这里使用使用sync.Map会更合理些,因为sync.Map底层完全包含了这个逻辑。可能写Java的同学看着上面这段代码很眼熟,但确实是用错了,关于为什么用错了以及会造成什么影响,请大家关注后续的文章。 我大概分析了下大家宁愿使用Mutex+Map,也不愿使用sync.Map的原因: sync.Map本身就很难用,使用起来并不像一个Map。失去了map应有的

  • 我爬取了爬虫岗位薪资,分析后发现爬虫真香

    闲着无事逛逛招聘网站,无意看到了爬虫岗位的薪资,发现真香,今天决定爬取下来并进行分析 目录 1.开始 2.分析目标网站的标签,发现想要的字段(岗位、公司名称、城市、薪资)都在p标签里面,如下图 3.开始编写代码 4.存储到csv文件 5.分析数据并进行可视化 5.1.可视化1:爬虫岗位常用名称 5.2.可视化2:爬虫岗位最多的城市 5.3.可视化3:薪资分布情况 首先,确定目标网站: https://jobs.51job.com/pachongkaifa 复制 1.开始 打开pycharm,新建文件->导入必备的库->加入常用的请求头header #导入requests包 importrequests fromlxmlimportetree #网页链接 url="https://jobs.51job.com/pachongkaifa/p1/" #请求头 headers={ "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*

  • nginx using uninitialized &quot;XXXX&quot; variable while logging request

    背景 最近在查看nginx的日志的时候,发现了有一条很奇怪的日志,就全力去排查。 错误日志: nginx.conf配置: 触发条件: 访问:http://localhost:8907/logo之后,会在error日志中记录下usinguninitialized"XXXX"variablewhileloggingrequest的日志 原因 虽然set设置的变量是全局变量,但是每个location中对于set设置的全局变量如果没有赋值,也是未定义变量。如果使用了就会触发警告。

  • 调试shell脚本时,在跟踪里输出行号

    调试shell脚本时,在跟踪里输出行号 先执行如下代码 exportPS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}:' 复制 再执行调试命令 sh-xtest.sh 复制

  • 服务器被攻击小记

    服务器一直在裸奔,三年多来也一直没有啥问题,直到最近发现访问非常缓慢,一开始我们也没有在意,因为所处的机房,近些日子线路问题不断,以为是线路问题,直到被机房通知服务器被攻击了,由于已经影响到了其他机子,把我们限流了。。 突然间感觉就是两眼发蒙,总结问题如下: 机房远在香港,无法立即到机房处理问题。 机房也没有告知是什么样的攻击,或者当前是什么样的状况 服务器也偶然能访问下,感觉不像被DDOS等类似攻击。 机房的KVM一直申请不下来,ssh连接上去还没怎么动,就又断了,想要好好看下服务器的情况也几乎不可能。 最终,开了个会分析了下,最终分析如下:攻击分两种: 是被攻击 是被当做肉鸡了 那么按照现在还能偶尔连上,还能偶尔操作下,而且程序都正常。估计是被当做肉鸡了。因为如果是被攻击了。比如被DDOS攻击了,那么,首先是连上的机会是几乎没有的,而且程序几乎是挂了。 那么,问题来了,怎么解决呢。 关门打狗。打开防火墙,估计就能挡住了一大波的攻击,那么服务应该也正常了。但是可能就找不到被攻击的原因了。 先找出被攻击的原因,解决攻击源,当然,这样肯定是能够解决问题的。 讨论过后,发现

  • 09材质遮罩。

    1.如果不是单颜色,应该把材质颜色连接到EmissiverColor(自发光颜色) 2.要使用遮罩,BlendMode(混合模式)要改成Translucent   补充:Translucent和Masked区别     Translucent表示半透明的,Masked(一般用于植物,叶片透明)要么有,要么没有。。    A.调用节点:RadialGradientExponential(放射性渐变系数)     LinearGradient(线性渐变系数):可以调整上下或者左右渐变。   3.移动遮罩   A:调用TextureCoordinate(材质坐标)   B:  

  • JVM默认内存大小

    堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 堆内存分配 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。 非堆内存分配 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPer

  • python之路——阅读目录

    阅读目录 希望大家多多交流,有错误的地方请随时指正,笔记记得可能有点杂   一、python入门 计算机基础 编程语言发展史和python安装  二、数据类型、字符编码、文件处理 python基础数据类型 python流程控制 数字类型、字符串、列表及其内置方法 列表、字典、集合、元组常用操作及内置方法 编码格式和文件操作 文件操作的补充 encode和decode的区别 三、函数 函数的基本使用和参数 函数的进阶(一) 闭包函数和装饰器 函数递归、二分法、匿名函数、三元表达式、内置函数 迭代器、生成器、一部分内置函数 四、模块 import/from...import...模块的调用 正则表达式和re模块 collections,time,random,os,sys,序列化模块(json和pickle)应用 包、logging模块、hashlib(加密模块)、openpyxl模块、深浅拷贝 五、面向对象 面向对象基础知识点 面向对象三大特性之——继承 面向对象三大特性之——封装 面向对象三大特性之——多态和一些内置函数 六、面向对象高级 面向对象高级——反射和元

  • 开放的智力2:游戏不值得

    游戏与成长有必然的联系吗?有没有必要戒掉游戏? 首先我想声明的是,游戏在我心里就是艺术品,同时也是许多伟大的人类智慧的融合,所以对于游戏本身和游戏行业的从业者,我始终持有一种欣赏和倾慕的态度。   但是对于广大的游戏爱好者来说,我虽然认为完全戒除游戏没有必要,但是有意识地控制自己玩游戏的时间、丰富自己其他方式的业余生活,很有必要。因为,玩游戏这点事,是真真切切的「以有限搏无限」即「以有限的生命时间去搏无限的游戏时间」的活动。   这里可能有人会问,电影、电视剧、动漫、小说这些东西,不也是多得无边无际,不可能看得穷尽吗?为什么独独要说游戏呢?还真的很不一样,因为与电影、电视剧、动漫、小说这些不同,游戏是同时拥有以下两种特质的文化产品:   一曰排列组合; 二曰循环语句。   排列组合大家高中数学都学过,有限个数的一组东西,一经组合就会演变成数量大得多的不同情形。游戏的一大基础,也就是排列组合。游戏中的角色、怪物、宝物等,都是若干个属性值比如生命值、攻击力、防御值、气值等的组合,每个属性下本就可取几十种等级,再加以组合,几成无限。所以一个玩家,在游戏

  • ETH 交易手续费计算

    ETH交易过程中需要支付一定的手续费(矿工费),手续费主要是出于安全考虑以及矿工激励。 用户在交易过程中,可以选择对应的手续费,矿工会优先打包手续费高的交易。所以选择的手续费越高,交易速度越快。 矿工费如何计算? 矿工费计算公式为:矿工费=GasPrice*GasLimit。 GasPrice:价格,就是一份Gas的价格。(价格越高,交易越快) GasLimit:限额,一定要比实际消耗的Gas大。 以汽车为例:GasPrice就是油价。GasLimit像油箱可存放的油量。GasLimit如果小于实际消耗的油量,就会走到一半没油了。 如果GasLimit设置的小于实际消耗的Gas。则会: 交易失败。 返还交易的金额。 交易时已经产生的Gas不会返还。(以汽车为例:车开到一半,因为油箱太小而没有油了。已经消耗的油不会返还的。) 矿工费如何选择 在交易过程中选择合适的GasPrice。(会影响交易速度,看情况选择) 选择合适的GasLimit,不能设置小于实际(会交易失败)。不能设置太大(会产生更多的手续费)

  • 阿里云效本地仓库迁移

    拷贝包到自定义文件夹   下载批量导入工具到自定义文件夹https://agent-install.oss-cn-hangzhou.aliyuncs.com/migrate-local-repo-tool.jar   打开本地的GitBash切换到工具的位置       批量导入命令说明       仓库地址及用户名密码配置获取 https://packages.aliyun.com/maven       Settings文件说明       批量导入命令执行(复制命令进行对应路径或账号密码修改)$java-jarmigrate-local-repo-tool.jar-cd"/d/Sxy/Job/Manage/Git/aliyun/maven"-t"https://packages.aliyun.com/maven/repository/2072456-snapshot-ghX/"-u"601ca3ca8e5"-p"PCYu]6j" &n

  • 红黑树——依天理以神遇

    红黑树是AVL树的另一变种,他也能在动态变化的过程中保持某种意义的平衡,对红黑树的操作最坏情况下也只有$O\left(\logn\right)$的复杂度,而且下面我们会看到,对于插入而言我们有另外一种比AVL树更容易的实现方法,非递归的。在具体谈到技术细节之前,我们或许会有疑问:已经有AVL这种渐进复杂度很低的结构了,也能保持平衡,不至于让树高突破天际,那为什么还要研发新的变种呢?动力何在,红黑树在整个平衡树体系里又处于什么地位呢?先看下今天主角的基本信息。   回顾此前的各个结构,不论是线性的向量、列表、栈or队列,也无论半线性的树结构和非线性的图。它们大多呈现这种特征:每经一次动态的操作,逻辑结构变化,然后转入新的状态,此前的状态完全丢失,这类结构也因此称作ephemeraldatastructure。每一个固定时刻的状态都是稍纵即逝的。但是实际场景中这并不够用,很多时候我们可能希望查阅它的历史版本并加以修改之类的。那此前所学就不足以解决问题了,因此要设计新的结构,这是它的动力所在。因此无论静态还是动态操作,除了元素的值,还需要同时指定一个版本号。如果一个数据结构能够支

相关推荐

推荐阅读