面试锦囊之知识整理系列
面试锦囊系列一直有收到大家的反馈,包括后台内推成功的消息、朋友的同事从创业小公司成功跳到huawei等等,非常高兴小破号的这些整理分享能够真正地帮助到大家,以后也会继续。为了更方便大家的交流沟通,我们建立了算法面试讨论组,感兴趣的小伙伴可以订阅后台回复"面试"加入
好了不废话啦,今天文章的主题继续分享上一篇未写完的部分,14种模式搞定面试算法编程题(PART I)。经过本人之前笔试面试经验证明确实确实非常非常高频,一定要十分熟悉。对于每一种思路会给出
循环排序模式描述了一种处理涉及包含给定范围内的数字的数组问题的有趣方法。其一次遍历数组一个数字,如果正在迭代的当前数字不是正确的索引,则将其与正确索引处的数字交换。
在许多问题中,可能会要求我们反转链表的一组节点之间的链接。通常,约束就是需要就地执行此操作,即使用现有节点对象而不使用额外内存。这是上述模式有用的地方。
此模式一次反转一个节点,从一个指向链表头部的变量(当前)开始,一个变量(上一个)将指向已处理的上一个节点。以锁步方式,将通过将当前节点指向前一个节点,然后再转到下一个节点来反转当前节点。此外,更新变量“previous”以始终指向您已处理的上一个节点。
在许多问题中,给出了一系列元素,需要我们将其分成两部分。为了解决这个问题,我们想要知道一个部分中的最小元素和另一个部分中的最大元素。这种模式是解决此类问题的有效方法。
这种模式使用两个堆:找到最小元素的Min Heap和找到最大元素的Max Heap。该模式的工作原理是将前半部分的数字存储在Max Heap中,这是因为我们希望在上半部分找到最大的数字。然后将数字的后半部分存储在Min Heap中,因为我们希望在后半部分找到最小的数字。在任何时候,可以从两个堆的顶部元素计算当前数字列表的中值。
无论何时给定排序数组,链表或矩阵,并要求查找某个元素,你可以使用的最佳算法是二分搜索。此模式描述了处理涉及二分搜索的所有问题的有效方法。二分搜索这么经典的思路我就不多介绍啦,直接看一个可视化复习一下
任何要求我们在给定集合中找到最大/最小/频繁“K”元素的问题都属于这种模式。
跟踪'K'元素的最佳数据结构是Heap。这种模式将利用Heap来解决从一组给定元素一次处理'K'元素的多个问题。大致思路是这样的:
K-way Merge可以用于解决涉及一组排序数组的问题。
给出'K'排序数组,可以使用Heap有效地执行所有数组的所有元素的排序遍历。我们可以在Min Heap中push每个数组的最小元素以获得最小值。获得总体最小值后,将下一个元素从同一个数组推送到堆中。然后,重复此过程以对所有元素进行排序遍历。
拓扑排序用于查找彼此依赖的元素的线性排序。例如,如果事件“B”依赖于事件“A”,则“A”在拓扑排序中位于“B”之前。流程大概是这样的:
缺失数字(LEETCODE): https://leetcode-cn.com/problems/missing-number/
[2]寻找重复数(LEETCODE): https://leetcode-cn.com/problems/find-the-duplicate-number/
[3]缺失的第一个正数(LEETCODE): https://leetcode-cn.com/problems/first-missing-positive/
[4]反转链表(LEETCODE): https://leetcode-cn.com/problems/reverse-linked-list/
[5]反转链表II(LEETCODE): https://leetcode-cn.com/problems/reverse-linked-list-ii/
[6]数据流的中位数(LEETCODE): https://leetcode-cn.com/problems/find-median-from-data-stream/
[7]滑动窗口的最大值(剑指offer): https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&tqId=11217&tPage=4&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
[8]搜索旋转排序数组(LEETCODE): https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
[9]寻找两个有序数组的中位数(LEETCODE): https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
[10]寻找旋转排序数组中的最小值(LEETCODE): https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
[11]前K个高频元素(LEETCODE): https://leetcode-cn.com/problems/top-k-frequent-elements/
[12]前K个高频单词(LEETCODE): https://leetcode-cn.com/problems/top-k-frequent-words/
[13]第k个排列(LEETCODE): https://leetcode-cn.com/problems/permutation-sequence/
[14]合并两个有序链表(LEETCODE): https://leetcode-cn.com/problems/merge-two-sorted-lists/
[15]合并K个排序链表(LEETCODE): https://leetcode-cn.com/problems/merge-k-sorted-lists/
[16]丑数系列(LEETCODE): https://leetcode-cn.com/problems/ugly-number-ii/
[17]课程表系列(LEETCODE): https://leetcode-cn.com/problems/course-schedule/
[18]矩阵中的最长递增路径(LEETCODE): https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/
[19]序列重建(LEETCODE): https://leetcode-cn.com/problems/sequence-reconstruction/
- END -
推荐阅读
From Word Embeddings To Document Distances 阅读笔记
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
可解释性论文阅读笔记1-Tree Regularization
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP君微信(id:AINLP2),备注工作/研究方向+加群目的。