LeetCode常用算法模式&大厂面试题整理

本文整理了LeetCode中常见的算法模式,包括滑动窗口、双指针、快慢指针等,并结合实际例子详细解释,同时列举了BATJ等大厂面试中涉及的相关题目,帮助读者提升算法能力。
突然发现虽然刷了很多算法,但是能力并没有得到提高,刷过的题也忘了很多,欲速则不达是真的,距离9月秋招开始差不多还有两个月吧,静下心来慢慢回顾总结,也刷一刷名企真题,持续更新,希望有帮助。按部就班最快,心平气和最燃

1、滑动窗口

    1 一个左指针,一个右指针。其中左指针用于缩小范围,右指针用于扩大搜索范围。一般求滑动窗口的最小值都是在缩小左指针的时候取得的。
    2 右指针扩展的条件时:只要当前还没有满足条件,就暴力增长,直到第一次满足条件为止。
    3 左指针收缩的条件:只要当前指针的缩小还没影响窗口的可满足性,就一直暴力向左增长。一但当前指针向前移动的时候影响了窗口的可满足性,就记录下当前的窗口大小,并更新目前为止满足条件的最小窗口记录。之后,再次扩展右指针,使得窗口满足题目的条件。
    这也是自己比较熟练的一个算法,以前用这个算法对华为的一道机考题进行了优化,将时间复杂度由传统方法的O(m*n)降低到了O(n)。
博客链接
在这里插入图片描述参考例题
    生成窗口最大值数组 牛客网链接>>>>>>答案
    最大值减去最小值小于或等于num的子数组数量 牛客网链接>>>>>>答案
最短包含子串长度/最小覆盖子串(待完善)

2、双指针

    双指针的基本思想是使用两个指针串联迭代数据结构,知道一个或两个指针达到某个条件停止。在排序数组或链表中搜索元素对时,两个指针通常很有用, 例如将数组的每个元素与其他元素进行比较时。
双指针问题又可以分为指针在两端向中间行驶和指针在一侧向另一侧行驶问题
在这里插入图片描述参考例题
4-sum 3sum-closest 3-sum
最长无重复子串
长度最小的子数组
蓄水池问题

3、快慢指针

    也被称为“龟兔算法”,基本思想是使用两个指针以不同的速度在数组或链表中移动。在处理循环链接列表或数组时,此方法非常有用。通过以不同的速度移动(例如,在循环链表中),算法证明两个指针必然会相遇。一旦两个指针都处于循环循环中,快速指针就应该捕获慢速指针。

在这里插入图片描述应用举例(这一部分比较简单,注意边界条件即可)
链表或数组循环
用于找中间元素
需要知道某个元素的位置或链表的总长度

4、合并区间

    合并间隔模式是处理重叠间隔的有效技术。在涉及间隔的许多问题中,你可以需要找到重叠间隔或合并间隔(如果它们重叠)。给定两个间隔 a和 b,可能存在6中不同的间隔交互情况:
在这里插入图片描述应用举例
区间重叠问题
区间列表的交集
无重复区间问题
借助HashMap的问题
添加链接描述

5、循环排序

    循环排序模式描述了一种处理涉及包含给定范围内的数字的数组问题的有趣方法。其一次遍历数组一个数字,如果正在迭代的当前数字不是正确的索引,则将其与正确索引处的数字交换。
在这里插入图片描述应用举例
第一个缺失的正整数(有正有负循环排序代码比直接排序代码简单)
缺失数字(有很多种解题方案,循环排序方法的复杂度最优)
寻找重复数据(其实笔试的过程中可以用空间换时间和代码复杂度)

6、就地反转链表

    在许多问题中,可能会要求我们反转链表的一组节点之间的链接。通常,约束就是需要就地执行此操作,即使用现有节点对象而不使用额外内存。这是上述模式有用的地方。此模式一次反转一个节点,从一个指向链表头部的变量(当前)开始,一个变量(上一个)将指向已处理的上一个节点。以锁步方式,将通过将当前节点指向前一个节点,然后再转到下一个节点来反转当前节点。此外,更新变量“previous”以始终指向您已处理的上一个节点。
在这里插入图片描述应用例题
添加链接描述
添加链接描述

7、堆-优先队列问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值