乐趣区

关于前端:面试必备算法系列-滑动窗口入门

前言

本文已收录 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、蘑菇街资深前端、蚂蚁金服平安专家、各路大牛都在)。

接水怪也会定期原创,定期跟小伙伴进行经验交流或帮忙看简历。加关注,不迷路,有机会一起跑个步???? ↓↓↓

退出移动版