首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LeetCode第三题,五个版本迭代优化带你吃透two pointers算法

作者 | 梁唐 大家好,是梁唐。 今天给大家带来LeetCode第三题题解——无重复字符最长子串,题意等描述来源于力扣官网。...我们知道s长度最大是1e4, O(n^3) 量级下,计算复杂度大约是1e12这个量级,显然会严重超时,必须要进行优化。 怎么优化呢?...其实稍微细想一下,会发现几个问题。第一个问题是,我们迭代合法区间第一个版本从哪里来?第二个问题是,如何可以保证我们一定能够找到最大那个合法区间呢?第三个问题是这个算法复杂度是多少?...我们看一下会注意到我们用到了两重循环,其实仔细思考一下会发现内部循环是可以去掉怎么去呢?...首先,我们思考一下里面while循环用途,是为了弹出区间左侧字符,使得s[r]这个字符区间当中不再出现,只有这样才能将s[r]加入区间。

39410

学会two pointers算法,玩转LeetCode

作者 | 梁唐 大家好,是梁唐。 今天给大家聊一个非常经典也非常简单算法,学会了这个算法不说能够纵横leetcode,但可以解决非常多问题。...理解了算法核心目的之后,再来理解它原理就容易多了,就只有一个问题需要解决,就是怎么样维护区间?...因为如果对于它理解足够深入,就会发现这道题还有继续优化空间,继续优化前提依赖我们对算法理解。 那么哪里还可以优化呢?其实很简单,用红框标记一下就知道了。...我们维护区间合法性时候,使用了while循环弹出左侧边界。仔细想,我们使用while循环目的是什么?是移动区间左侧边界l,移动l目的是什么?...如果最近一个s[r]l右侧,说明会构成冲突,那么我们直接把l移动到它后一位即可,就代替了while循环一位一位移动l操作,大大提升了运行速度。

22320
您找到你想要的搜索结果了吗?
是的
没有找到

框架源码调试实战之easypoi异常解决方案精讲

最近有个同事遇到了个棘手问题,easypoi导出文件出了bug,却不知道怎么回事,无从下手,无可奈何,由于事态紧急,只能火急火急求助于我。问他:“开发时候功能调通了吗?...同事均回答:“之前测试都没有问题,之前账号数据可以导出,却唯独是这个不行。仔细看了代码,根本就不觉得有什么问题啊,不知道原因出在哪里……” 导出错误文件如下: ?...正常导出文件应该是这样: ? 详细了解情况以后便开始了源码探究之路。...正常参数下,判断为false,不会再次进入do while循环中 整个过程逻辑如下:1.首先创建了迭代器;2.执行了一次do……while循序,循环中判断迭代器是否还有下一个值,第一次时候有下一个值于是没有返回...null,而是创建了sheet对象;3.第一次循环执行完毕后,才开始判断条件(do……while循环是先执行一次循环,再判断条件),这时候入参名称和sheet名称相同,取反后便不成立,于是返回了有值对象

77520

volatile关键字Android到底有什么用?

意识到有些朋友对于volatile这个关键字理解还是有误区。 另外也有朋友留言说,虽然知道volatile关键字作用,但是想不出在Android开发具体有什么用途。...理论上来说,这两个线程同时运行,那么就应该一直交替打印,你改值,再给你改回去。 实际上真的会是这样吗?我们来运行一下就知道了。 ?...可以看到,打印过程只持续了一小会就停止打印了,但是程序却没有结束,依然显示在运行。 这怎么可能呢?理论上来说,flag要么为true,要么为false。...这样Thread2while循环就会跳出,然后操作value时候出现空指针异常。 所以说,指令重排功能一旦进入了多线程环境,也是可能会出现问题。...其实觉得任何一个技术点都不应该去生搬硬套,你只要掌握了它,该用到时能想到它就可以了,而不是绞尽脑汁去想我到底要在哪里使用它。

59020

框架源码调试实战之easypoi异常解决方案精讲

最近有个同事遇到了个棘手问题,easypoi导出文件出了bug,却不知道怎么回事,无从下手,无可奈何,由于事态紧急,只能火急火急求助于我。问他:“开发时候功能调通了吗?...仔细看了代码,根本就不觉得有什么问题啊,不知道原因出在哪里……” 导出错误文件如下: 图片.png 正常导出文件应该是这样: 图片.png 详细了解情况以后便开始了源码探究之路...其实除了此方式外,还可以再往前追溯入参,往往也能找到答案,本例子前端封装参数时候是指定了ExcelType类型,如下图: 图片.png 通过以上两种途径便可以知道框架源码方法,众多实现究竟应该调用那一个源码方法...sheet对象: 图片.png 整个过程逻辑如下:1.首先创建了迭代器;2.执行了一次do……while循序,循环中判断迭代器是否还有下一个值,第一次时候有下一个值于是没有返回null,而是创建了...sheet对象;3.第一次循环执行完毕后,才开始判断条件(do……while循环是先执行一次循环,再判断条件),这时候入参名称和sheet名称相同,取反后便不成立,于是返回了有值对象,反之则再次进入了循环

1.1K10

如何跳出令人窒息职场死循环

你常常会想,要是有个过来人能和我一起聊聊该多好,你想知道他们是怎么过来,你还想确认自己并不孤单。 这就是这本书存在意义。...它汇总了从软件开发工程师、技术经理、项目经理、项目总监、初创公司技术总监等各种岗位一路走来思考过各种问题适合做开发吗? 编程语言怎么选?...别人月薪 3 万,自己只有 3 千,想拿高薪,怎么做? 面对多个Offer,怎么选择才不后悔?怎么拒绝不喜欢Offer? 简历投了几十份无人问津,问题出在哪里怎么优化才能提高通过率?...公司都喜欢年轻敢拼能加班程序员,年龄大了怎么办? 程序员一定要转管理吗?怎么转?有什么问题和挑战?怎么应对? 想跳槽了,该怎么做准备才能找到理想下家?...不知道设定什么目标、怎么设定,才能让自己积极前进…… 想参与创业公司,获得预期中高回报,又怕风险,怎么办? 团队不稳,开发人员纷纷离职,要离开还是留下?

1.3K40

LeetCode3 一题学会尺取算法

其实不然,看复杂度不能简单只看用了几个循环变量,而需要分析算法当中究竟执行了多少计算量。怎么证明算法复杂度呢?我们怎么知道窗口到底移动了多少次呢?...算法讲完了,还有一个细节没讲清楚,我们怎么维护区间合法呢? 也很简单,我们维护一个map,记录区间内字符出现了多少次。我们遇到新字符,就在map中加一,退出字符,就在map减一。...,但是并没有结束,这题还有优化空间。 那么,怎么做进一步优化呢? 敏感同学观察上面这段代码时候,可能会觉得中间while循环有点别扭。...虽然我们经过分析l最多也就移动到r位置,不会出现越界等问题,但看到循环里套了循环还是会觉得不太舒服。 我们下一个优化,就和这个循环有关。那么怎么才能把循环去掉呢?...我们先从它产生原因入手,我们之所以需要一个循环,是因为我们并不知道引起重复S[r]这个字符区间里出现位置什么地方,如果我们能够知道,那么就很简单,我们直接把l移动到它右边即可。

44930

直接创建了一个游戏场景【python 游戏实战 02】

前言 本系列文章将会以通俗易懂对话方式进行教学,对话中将涵盖了新手在学习一般问题。...小C:是的,我们在下面添加一个 while 循环,这个 while 循环内一直对游戏事件进行监听,这样我们就知道用户做了什么事情,例如用户按下了什么键。 小媛:明白,请继续。...作为条件就好了,然后循环内有一个 for 循环用来遍历 pygame 游戏中事件?...在这个方法第一个传入是图片参数,第二个传入是要从哪里开始绘制坐标。 小媛: 那图片怎么获得呢?...小C:是的,其实哪一个代码少了一个很关键内容你知道是啥吗? 小媛:。。。忘记了。 小C:少了一个屏幕更新,我们应该在每次循环时候都应该刷新屏幕,因为我们每次都需要绘制一些游戏元素到这个窗口中。

57150

算法浅谈——人人皆知却很多人写不对二分法

如果这个问题不想清楚,想要一次性写出没有bug代码,老实说很不容易。 首先,二分终止条件究竟怎么写,是while (l < r) 还是 while (l <= r) 还是别的?...我们都知道代码世界里,数组是从0开始,一个长度为10数组,最后一个元素下标是9。...区间确定了,终止条件也就明确了,左闭右开区间[l, r)不为空的话,r 至少大于等于l + 1。我们要在区间长度大于1时候执行二分,所以二分循环条件应该是while (l + 1 < r)。...但是还没有结束,依然还有一个小问题。 ? 前文说了,a[mid]和v关系有三种,当a[mid] = v时候,我们就找到了答案。...换成while (l < r)行不行?这个问题就留给大家思考。 二分法虽然简单,但这些细节都理解清楚也并不容易,算法领域当中,如果细节没有理解到位,阴沟里翻船是非常平常事情。

56220

python如何用列表+yield打破内卷递归

前言 一切要从小伙子python学习网站上一道练习题说起。题目如下: 简单说,就是打印一个文件夹下,所有文件名字,包括所有子文件夹文件。如果只是用 python 提供内置模块,是非常容易。...---- 递归 经过一番资料查阅,小伙子终于知道问题出在哪。 行7:既然确定是一个文件夹路径,那就再次调用函数 print all path 把一个问题拆解成小问题,一个函数代表一个问题解决方案。...这是递归退出条件,必须保证递归存在退出条件,否则就是死循环 python ,函数调用信息保存在一个叫帧东西里面,以前就有相关文章讲解,相关链接放在文末 这就是调用栈发挥作用时候。...显然第一个任务就是传进来文件夹路径 行5:使用 while 循环,条件是所有任务都处理完毕(任务列表为空) 行7:循环里面,每次取出一个任务(文件夹路径),得到该文件夹所有路径 行13:如果是文件夹路径...但是题目竟然还没有结束。 题目提示:"恭喜你,解决了问题。不过,现在函数不能应对需求变化,只能打印路径。

1.7K20

循环、分支...都可以Python中用函数实现! | 函数式编程,打开另一个世界大门

这么一位程序员大牛+重磅写手,在网络上写了几篇深远影响文章: 其中有一篇跟本文要说内容有关——《面向对象编程和函数式编程问题出在哪里》,这篇文章他将面向对象编程,和函数式编程并列,对两种编程进行了比较和点评...另外,由于Python是一种通用性编程语言,它支持函数式编程,因此本文代码实例都用Python来举例。 「平凡世界」,我们一般都是怎么写代码?...以前学SAS时候看到过一句话: 一门编程语言,只要能实现分支和循环,就能够完成几乎所有的运算。 这么说来,我们平时编程无外乎用下面这几个语句: 分支:if...elif......循环:for/ while/ do...loops 其他还有赋值、函数定义def等。 而在「函数式编程」世界,这些将全部用函数来实现!!...不管怎样,我们大概知道了「函数式编程」这个概念: 它用一系列函数取解决问题,代码简洁,没有循环体,也不用生成各种倒来倒去临时变量。 但是,回到开篇王垠批判文章,「函数式编程」有哪些缺点?

1.5K60

优化篇:性能提升了200%

,很多小伙伴应该知道问题出在哪里了。...说到这里,大家应该应该知道具体怎么优化了吧?好,我们继续往下看! 解决方案 解决问题思路有了,接下来,我们看看如何使用代码实现我们上面分析解决问题思路。...进一步优化 通过上面对系统优化,基本能够达成我们优化目标,但是上面的解决方案存在着不足地方,那就是 while 循环里每次都要新建两个线程分别执行getHasNoOrders() 方法和 getHasNoStock...使用CountDownLatch类优化我们程序具体做法就是:程序while()循环中首先创建一个CountDownLatch对象,计数器值初始化为2。...平时工作过程,我们需要认真思考,找到系统性能瓶颈所在,找出在逻辑上不相干,并且没有先后顺序业务逻辑,将其放到不同线程执行,能够大大提供系统性能。

38630

错误记录 | 一个导致ListViewitem内容全部重复可能原因

遂思前想后,开始以为是ListView问题,但是没结果。接着以为是Adapter问题,但很快又否决了这个想法,因为项目一开始也是用SimpleAdapter,且当时ListView显示正常。...无意中看到一篇Blog: HashMap对象重复赋值多线程教训 https://blog.csdn.net/goodguyzl/article/details/83847286 该文中写道: “HashMap...对象是while循环外面声明(第一行代码那里),但是循环里面这个HashMap对象反复了put了key相同两个键值对,问题可能就出在这里”“HashMap对象是while循环外面声明(第一行代码那里...),但是循环里面这个HashMap对象反复了put了key相同两个键值对,问题可能就出在这里” 猛然意识到我也犯了同样错误!...这就是为什么项目里ListView显示item全是最新添加一个快递信息。 下面是代码和运行界面的前后对比。

75810

Debug 一个 uWSGI 下使用 subprocess 卡住问题

一个验证就是,去应用运行环境开一个 Python REPL 执行这段代码,是能正常得到结果应用运行环境直接运行 hping3 命令,也是没有问题。...到这里,其实已经花费了很多时间了,得到事实有: 容器里面执行 hping3 是完全没有问题,权限是足够 直接使用 Python3 REPL 执行这段代码也是没有问题,代码逻辑是对 到这里你能猜到问题出在哪里了吗...这个 Python 写服务是作为 WSGI 应用跑 uWSGI 里面的。不知道和 uWSGI 有没有关系(直觉告诉是有的,比直觉更厉害同事也告诉是有关系)。...本文从这里开始,就以事后诸葛亮视角,看看有了上面的信息,我们怎么从正确思路一步一步找到问题。...不知道怎么结束。 但是往上看,有一段代码获取了当前 pid,然后给自己发送了 SIGALRM。再往前,发现注册了 SIGALRM handler. SIGALRM 是什么呢?

98320

【爬虫实战】用Python采集任意小红书笔记下评论,爬了10000多条,含二级评论!

那么Cookie从哪里获得呢?方法如下:下面,开发翻页逻辑。由于我并不知道一共有多少页,往下翻多少次,所以采用while循环,直到触发终止条件,循环才结束。那么怎么定义终止条件呢?...注意到,返回数据里有一个叫做"has_more"参数,大胆猜测它含义,是否有更多数据,正常情况它值是true。如果它值是false,代表没有更多数据了,即到达最后一页了,也就该终止循环了。...breakpage += 1另外,还有一个关键问题,如何进行翻页。...查看请求参数,如下:这里游标,就是向下翻页依据,因为每次请求返回数据,也有一个cursor:大胆猜测,返回数据cursor,就是给下一页请求用cursor,所以,这部分逻辑实现应该如下(...']另外,第一章节提到,还爬到了二级评论及二级展开评论,怎么做到呢?

3.2K41

性能提升了200%!(优化篇)

,很多小伙伴应该知道问题出在哪里了。...说到这里,大家应该应该知道具体怎么优化了吧?好,我们继续往下看! 解决方案 解决问题思路有了,接下来,我们看看如何使用代码实现我们上面分析解决问题思路。...进一步优化 通过上面对系统优化,基本能够达成我们优化目标,但是上面的解决方案存在着不足地方,那就是while循环里每次都要新建两个线程分别执行getHasNoOrders()方法和getHasNoStock...使用CountDownLatch类优化我们程序具体做法就是:程序while()循环中首先创建一个CountDownLatch对象,计数器值初始化为2。...平时工作过程,我们需要认真思考,找到系统性能瓶颈所在,找出在逻辑上不相干,并且没有先后顺序业务逻辑,将其放到不同线程执行,能够大大提供系统性能。

32510

特征提取之 DictVectorizer

使用这个类时候会遇到一些问题怎么用它进行特征提取同时顺便把这些问题解决了。...知道了代码逻辑之后就要运行代码了,运行结果如图所示。 ? 发现报错,而且这个错误非常莫名其妙,光看报错完全不知道问题出在哪里。...还是报错,更加莫名其妙,同样也是看不出错哪里,我们把那个列表推导式写完整一些,每次循环时候顺便打印循环变量 i 值,代码如下: from random import random from pandas...确实发现循环变量 i 一旦变成 2 就会出错,目前敢肯定方向是对,就是数据格式需要做转换,但是这里肯定有一些细节没注意。...首先猜测问题出在 X_train,先打印一下 X_train 看看,代码如下: from random import random from pandas import DataFrame from

1.8K10

如何在 Python 中使用 unidecode

以下是如何在 Python 中使用 unidecode 库示例和步骤:1、问题背景正在尝试从文本文件删除所有非 ASCII 字符。... perl 很容易地使用了这个模块,只需调用 while () { $_ = unidecode($_); },这个模块是对 perl 模块直接移植,文档表明它应该以相同方式工作...确信这是一个简单问题只是对字符和文件编码了解不够,不知道问题出在哪里原始文件编码为 UTF-8(从 UCS-2LE 转换而来)。...问题可能更多地与我缺乏编码知识和错误处理字符串有关,而不是模块,但希望有人可以解释一下原因。到目前为止,已经尝试了知道一切,没有随机插入代码并搜索遇到错误。...引用模块文档:该模块导出一个函数,该函数采用 Unicode 对象(Python 2.x)或字符串(Python 3.x)并返回一个字符串(可以 Python 3.x 编码为 ASCII 字节)重点是

14910

pcr为什么定量不出来?

今天小编就带大家一起探讨一下~ (图片来自我p) qPCR就是荧光定量PCR,就是反应体系中加入荧光基团,利用荧光信号变化,实时检测每次循环产物量变化,对标本起始模板拷贝数进行定量分析。...如果标本量多,循环数就少。 qPCR应用(两个字:广泛!) 绝对定量:病原体检测,转基因动植物转基因拷贝数检测......(图片来自我p) 好,大家改掉自己上面的小习惯以后发现,欸?实验结果怎么害是透着一丝不对劲呢?...小编以前在做时候,也经常出现各种不正经结果,有的结果甚至师兄师姐也没遇见过,当时因为不知道问题出在哪,头秃不行。...整个实验过程其实并不难,关键在于是否了解它原理,是否正确做好每一步。当然啦,真的遇见问题时候,我们也不要气馁,要积极思考问题出在哪里,并在接下来实验改正。

1.7K40

关于c语言循环想说是:

while循环要当成当循环,第一篇就强调过,一直理解成当就好了,do,while循环也一样就是先做一步然后当怎么样再返回来 for循环循环里面用到是最多吧 for初始化 for初始化就是第一步...,若是循环嵌套初始化是什么样子第一篇文章说到,对于循环嵌套需要注意是首先分清父子循环,就是父亲循环一步,子循环要全部完成,进行下一步父循环循环嵌套看代码时候容易出现问题是忽略子循环初始化...,上面已经清晰了解到for真正样子,对于for循环我们要思考一下其实每个程序都是一步一步进行,我们面对一个个问题时候都应该想一下他在做什么?...所以先应该先建立循环体(从大范围思考再思考小范围)for循环中,for最大特点是范围确定循环次数已知道 就比如说5+55就要那循环做,循环了几次,一次呗,所以条件只能进行一步操作 #include...,那就是循环了一百次进行操作就是每两项之间关系怎么进入下一项,然后s=a+s 其实这些都是最简单内容,进阶一下就是循环嵌套,这个第一篇文章有就不细说了; 数组 数组也离不开循环,因为数组很烦,

7110
领券