前言
本文已收录 GitHub https://github.com/ponkans/F2E(有怪怪整顿的大前端常识技能树),欢送 Star,继续更新????
说实话,第一次写算法的怪怪,有点缓和,毕竟是一个数学怎么也及不了格的小菜。
大一上期末全班倒数第 4,噗呲,学渣实锤~
写之前有在想,怎么把算法写的比拟有意思,就像大学高数课,说实话,老师讲的是真心无聊。。
如果不是被所谓的学业规定所限度,真的很好听上来。
设 M(x0,y0,z0) 为立体上的已知点,n=(A,B,C) 为法向量,M(x,y,z) 为立体上的任一点,则立体的点法式方程为 xxxx,听着听着就睡着了。。。(老师,我扛不住了!!)
所以,怪怪会尽量写得乏味一点,让你看完差不多能够记住这个算法思维。
明天的题目是这样的,给定一个字符串,请你找出其中不含有反复字符的 最长子串 的长度。
简略解释一下。
比方给定字符串“丙丙接水怪接”
第一步,找出字符串中不含有反复字符的子串
- 丙
- 丙接
- 丙接水
- 丙接水怪
- 水怪接
第二步,计算出各个子串的长度,并取最大值。
- 在这里最大值显然就是 4,所以答案就是 4
ok,做完例题,其实很容易能够发现,外围就是第一步,找出不含有反复字符的子串。
那到底要怎么找呢,为了便于第一次看这个算法的小伙伴好了解,我画了几张图,大家看完还不懂,加微信骂我 渣男 好了!
找两把枪,起始的时候都指向第一个字符。
咱们顺利的找到了第一个不反复的子串,“丙”。
接着放弃红枪不动,绿枪向后挪动一位。
此时发现两枪之间,字符反复了,找到跟绿枪反复的地位,并且将红枪挪动到反复地位的后一位,那么此时变成了上面这个样子。
于是咱们找到了,第二个不反复的子串,跟第一个一样,也是“丙”。
不慌,咱们接着挪动绿枪。
因为,在挪动过程中,红绿枪之间始终没有反复,咱们找到了不反复子串“丙接”、“丙接水”、“丙接水怪”
不急不急,还没完,接着挪动绿枪(绿枪已到最初一位,完结)
能够发现,当咱们挪动完绿枪到“接”,此时红绿之间的子串呈现了反复的“接”,于是咱们还是按之前反复的思路:
- 找到反复字符“接”的地位
- 将红枪挪动到地位的后一位,即“水”
- 失去红绿之间不反复子串“水怪接”
由此可见,当咱们的 绿枪挪动到最初一位 的时候,咱们的找寻也就完结了,所有不反复的子串咱们也都找到了。
其实下面的红枪,绿枪,换一种说法就是左右指针,挪动红绿枪,就是挪动左右指针,两指针之间的窗口就是咱们要的后果。
很像咱们剪视频的时候,拖动的那个截取视频进度的东东。。
这种解题的思维,就是大家常说的滑动窗口。
了解了思维,写代码其实就比较简单了。
间接上 LeetCode 原题跟代码,一些边界状况我写在正文外面了(认真看正文哦,边界没写对会有问题 哦)。去除正文 10 行代码左右,倡议第一次做的小伙伴入手写一下,置信我,肯定能写进去。
说不定开启了你的 LeetCode 算法之旅哦????~
小结
滑动窗口的题,其实就是要搞清楚左右滑的界线是啥[吃瓜],比方下面这个题左窗口啥时候膨胀就是要害。
开了一个算法系列的专栏,后续会写一些算法相干的,近期算法应该都会围绕滑动窗口相干的开展去讲。
上一篇国庆小结提到了一些技术,近期大概率是这个节奏发文章
- redux 源码、设计思维
- promise、generator、async await 源码(毕竟工作中高频应用,须要看看)
- 罕用 hooks 源码剖析(新公司技术栈就是 React 这一套)
- 算法
我是接水怪,一个普普通通的程序员。感激各位的关注与 3 连????????
分割我 / 公众号
微信搜寻【接水怪 】回复”加群“,我会拉你进技术交换群。讲真的,在这个群,哪怕您不谈话,光看聊天记录也是一种成长。( 阿里技术专家、敖丙作者、Java3y、蘑菇街资深前端、蚂蚁金服平安专家、各路大牛都在)。
接水怪也会定期原创,定期跟小伙伴进行经验交流或帮忙看简历。加关注,不迷路,有机会一起跑个步???? ↓↓↓