《面试必备算法》系列 滑动窗口入门

前言

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值