赞
踩
突然发现虽然刷了很多算法,但是能力并没有得到提高,刷过的题也忘了很多,欲速则不达是真的,距离9月秋招开始差不多还有两个月吧,静下心来慢慢回顾总结,也刷一刷名企真题,持续更新,希望有帮助。按部就班最快,心平气和最燃 |
---|
1 一个左指针,一个右指针。其中左指针用于缩小范围,右指针用于扩大搜索范围。一般求滑动窗口的最小值都是在缩小左指针的时候取得的。
2 右指针扩展的条件时:只要当前还没有满足条件,就暴力增长,直到第一次满足条件为止。
3 左指针收缩的条件:只要当前指针的缩小还没影响窗口的可满足性,就一直暴力向左增长。一但当前指针向前移动的时候影响了窗口的可满足性,就记录下当前的窗口大小,并更新目前为止满足条件的最小窗口记录。之后,再次扩展右指针,使得窗口满足题目的条件。
这也是自己比较熟练的一个算法,以前用这个算法对华为的一道机考题进行了优化,将时间复杂度由传统方法的O(m*n)降低到了O(n)。
博客链接
参考例题
生成窗口最大值数组 牛客网链接>>>>>>答案
最大值减去最小值小于或等于num的子数组数量 牛客网链接>>>>>>答案
最短包含子串长度/最小覆盖子串(待完善)
双指针的基本思想是使用两个指针串联迭代数据结构,知道一个或两个指针达到某个条件停止。在排序数组或链表中搜索元素对时,两个指针通常很有用, 例如将数组的每个元素与其他元素进行比较时。
双指针问题又可以分为指针在两端向中间行驶和指针在一侧向另一侧行驶问题
参考例题
4-sum 3sum-closest 3-sum
最长无重复子串
长度最小的子数组
蓄水池问题
也被称为“龟兔算法”,基本思想是使用两个指针以不同的速度在数组或链表中移动。在处理循环链接列表或数组时,此方法非常有用。通过以不同的速度移动(例如,在循环链表中),算法证明两个指针必然会相遇。一旦两个指针都处于循环循环中,快速指针就应该捕获慢速指针。
应用举例(这一部分比较简单,注意边界条件即可)
链表或数组循环
用于找中间元素
需要知道某个元素的位置或链表的总长度
合并间隔模式是处理重叠间隔的有效技术。在涉及间隔的许多问题中,你可以需要找到重叠间隔或合并间隔(如果它们重叠)。给定两个间隔 a和 b,可能存在6中不同的间隔交互情况:
应用举例
区间重叠问题
区间列表的交集
无重复区间问题
借助HashMap的问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。