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

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

文章目录

1、滑动窗口
2、双指针
3、快慢指针
4、合并区间
5、循环排序
6、就地反转链表
7、堆-优先队列问题
8、Top K
9、归并
10、单调栈
11、回溯法
BATJ等大厂面试真题汇总

 

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、堆-优先队列问题

    在许多问题中,给出了一系列元素,需要我们将其分成两部分。为了解决这个问题,我们想要知道一个部分中的最小元素和另一个部分中的最大元素。这种模式是解决此类问题的有效方法。这种模式使用两个堆:找到最小元素的Min Heap和找到最大元素的Max Heap。该模式的工作原理是将前半部分的数字存储在Max Heap中,这是因为我们希望在上半部分找到最大的数字。然后将数字的后半部分存储在Min Heap中,因为我们希望在后半部分找到最小的数字。在任何时候,可以从两个堆的顶部元素计算当前数字列表的中值。

应用例题
窗口的中位数–利用优先队列
leetcode253. 会议室II(java):最小堆(非常常见的一道题 高频高频)
数据流的中位数
分金条的最小花费
做项目的最大收益

 

8、Top K

    其实这个问题可以归为顶堆问题,由于更高频所以单独讨论,任何要求我们在给定集合中找到最大/最小/频繁“K”元素的问题都属于这种模式。
跟踪’K’元素的最佳数据结构是Heap。这种模式将利用Heap来解决从一组给定元素一次处理’K’元素的多个问题。大致思路是这样的: 根据问题将’K’元素插入到最小堆或最大堆中; 迭代剩余的数字,如果找到一个比堆中的数字大的数字,则删除该数字并插入较大的数字。
在这里插入图片描述
Top-K 数字频率问题代码

class Solution {public int[] topKFrequent(int[] nums, int k) {HashMap<Integer, Integer> map = new HashMap<>();PriorityQueue<Map.Entry<Integer, Integer>> maxheap = new PriorityQueue<>((a,b) -> b.getValue() - a.getValue());int[] result = new int[k];for(int i = 0; i < nums.length; i++){map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);}for(Map.Entry<Integer, Integer> m : map.entrySet()){maxheap.offer(m);}for(int i = 0; i < k; i++){result[i] = maxheap.poll().getKey();}return result;}
}

词频Top-K问题代码(注意一下比较器的定义)

class Solution {public List<String> topKFrequent(String[] words, int k) {Map<String, Integer> count = new HashMap();for (String word: words) {count.put(word, count.getOrDefault(word, 0) + 1);}PriorityQueue<String> heap = new PriorityQueue<String>((w1, w2) -> count.get(w1).equals(count.get(w2)) ?w2.compareTo(w1) : count.get(w1) - count.get(w2) );for (String word: count.keySet()) {heap.offer(word);if (heap.size() > k) heap.poll();}List<String> ans = new ArrayList();while (!heap.isEmpty()) ans.add(heap.poll());Collections.reverse(ans);return ans;}
}

应用例题
前K个高频元素
前K个高频单词

 

9、归并

    K-way Merge可以用于解决涉及一组排序数组的问题。给出’K’排序数组,可以使用Heap有效地执行所有数组的所有元素的排序遍历。我们可以在Min Heap中push每个数组的最小元素以获得最小值。获得总体最小值后,将下一个元素从同一个数组推送到堆中。然后,重复此过程以对所有元素进行排序遍历。
在这里插入图片描述

应用例题
合并K个排序链表
计算小和

 

10、单调栈

参考文献
    从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈
    单调递增栈:栈中数据出栈的序列为单调递增序列
    单调递减栈:栈中数据出栈的序列为单调递减序列

stack<int> st;
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组)
{if (栈空 || 栈顶元素大于等于当前比较元素){入栈;}else{while (栈不为空 && 栈顶元素小于当前元素){栈顶元素出栈;更新结果;}当前数据入栈;}
}

应用例题
视野总和
柱状图中最大矩形解答
柱状图中最大矩形
左程云书籍单调栈问题链接—其实把这个搞懂,其他的都是这个题的变形

文章参考自 educative 参考文献链接

 

11、回溯法

在另外一篇博客中

LeetCode算法总结-回溯法与深度优先搜索

 

、BATJ等大厂面试真题汇总

1.栈排序
    单调栈问题,上文有说明;
2.链表实现队列
https://blog.csdn.net/qq_21808961/article/details/76239225
3.最长连续递增序列(leetcode-674)
https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/
4.二维数组的打印问题(回行打印 环形打印 之字打印)
5.根据数组建立二叉排序树(平衡和非平衡两种)
https://blog.csdn.net/Danielntz/article/details/53418843
6.一个数组实现两个栈(共享栈问题)
7.二叉树宽度与深度
    深度求解就是一个递归的过程,求宽度就采用按层遍历即可。宽度优先遍历也可求出深度。
8.二叉树是否对称(二叉树的一系列递归问题都应该掌握)
9.链表m到n反转和每k个一组进行旋转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e?tpId=46&&tqId=29154&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
10.贪心算法:N位数删除K个数字,使剩下的数字串最小
11.N皇后问题
12.找出来数组中每个元素后边第一个比它大的值(单调栈问题)
13.给你一个二叉树,从上往下看,然后左往右顺序输出你能看到节点,同一个竖直方向上上面的节点把下面的节点遮挡住了
14.链表反转,分别用遍历与递归实现(突然发现递归还挺有意思)
https://www.jianshu.com/p/b2542324898e
15.完全二叉树的最大深度与节点个数(左程云书上原题)
https://blog.csdn.net/qq_14842117/article/details/99864875
16.两个栈实现队列/两个队列实现栈
17.有序数组的交集和并集
https://blog.csdn.net/iteye_12801/article/details/82280726
18.删除链表中的重复值节点(包括保留问题和不保留问题)
https://www.nowcoder.com/practice/c087914fae584da886a0091e877f2c79?tpId=46&&tqId=29096&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024?tpId=46&tags=&title=&diffculty=0&judgeStatus=0&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
19.LeetCode 200. Number of Islands 岛屿的数量
20.二叉搜索树转有序双向链表(剑指offer原题)
21.回溯法-字符串全排列 ,可能有重复的,要去重
22.二叉搜索树第k个节点,不用中序遍历
23.有序数组查找重复元素个数
24.数组实现队列(大话数据结构中的实现非常好)
https://www.iteye.com/blog/jim8757-2060050
25.用二分法求开方
https://blog.csdn.net/u011489043/article/details/70126041
26.判断一颗树是不是二叉搜索树
27.链表第k-1个节点
28.手撕快排(不要低估基础算法)
29.二分法的一系列问题(不要低估基础算法)
30.数组中乘积最大的三个数
高端食材往往采用最简单的烹饪方法,算法也是。。。
https://blog.csdn.net/tjumiao/article/details/81189269?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase
31.求二叉树的深度,不使用递归(二叉树的问题挺高频)
32.实现链表,无序链表,对链表值奇偶分离并排序,空间复杂度O(1)

33.单调不递减数组,给一个target,找出大于等于target的下标index
34.单调不递减链表,删除掉重复值
35.无序数组构建一棵二叉排序树
36.行和列都是有序的二维矩阵找一个target值

37.是否是回文链表
38.打印出根节点到叶子节点的最长路径
39.不严格递增数组,要求删除出现次数大于k的数字,要求不要新建存储空间
40.链表相邻元素交换(跟每k个进行旋转的是同一个问题)
41.二叉树的最小公共祖先
42.输出根节点到叶子节点路径之和为target的路径列表(剑指offer原题)
https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca?tpId=13&&tqId=11177&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
43.【LeetCode】1038. 从二叉搜索树到更大和树
一道反向中序遍历的问题
https://blog.csdn.net/rabbitsockx/article/details/104350858
44.任意一个整型数组,判断是否可以将数组分为三个区间,每个区间中数值的和相同(荷兰国旗问题)
45.一个已经排序的数组,去除里面重复的元素 (leetcode中有个类似的问题:去重的时候元素可以有两个数是重复的,如果有三个以上的重复元素那么就留下两个比如:3333 去重后为33)
https://blog.csdn.net/feeltouch/article/details/45077589
46.错位的全排列(第一位不能是1,第二位不能是2)
47.k路链表合并
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6?tpId=46&&tqId=29156&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
48.二叉树的左视图 右视图问题(都可以根据二叉树的按层遍历解决)
49.输入一个数字n,构建一个完全二叉树并输出
50.已知电影开始与结束时间,看最多场电影

类似于这道题:
https://leetcode-cn.com/problems/non-overlapping-intervals/submissions/
1004. 最大连续1的个数 III
leetcode 打家劫舍相关问题
并查集实现相关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABPZero系列教程之拼多多卖家工具

此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用&#xff0c;内容包括手机登录、手机注册、拼团提醒、微信公众号绑定帐号、有拼团发送消息到微信公众号&#xff08;只要关注过微信公众号并已绑定系统帐号&#xff09;。学习此系列必备&#xff1a;手机验证码&#xff1a;使…

欢乐纪中某A组赛【2019.7.6】

前言 斐大爷NBNBNB 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC555(J−2)WYC(J-2)WYC(J−2)WYC210210210100100100100100100101010666(J−3)ZZY(J-3)ZZY(J−3)ZZY200200200100100100100100100000666(J−…

详解Vue中watch的高级用法

转载自 详解Vue中watch的高级用法 我们通过实例代码给大家分享了Vue中watch的高级用法&#xff0c;对此知识点有需要的朋友可以跟着学习下。 假设有如下代码&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <div> <p>FullName: {{fullName}}<…

g4e基础篇#4 了解Git存储库(Repo)

Git 存储库看上去就是一个文件夹&#xff0c;只是在这个文件夹中不仅仅保存了所有文件的当前版本&#xff0c;也同时保存了所有的历史记录&#xff0c;这些额外的信息都保存在当前文件夹下面的.git子目录中。因为前面我们所描述的git跟踪改动的特殊方式 &#xff0c;git可以在很…

P3846-[TJOI2007]可爱的质数【BSGS,数论】

正题 题目链接:https://www.luogu.org/problemnew/show/P3846 题目大意 BL≡N(modP)B^L\equiv N(mod\ P)BL≡N(mod P) 求最小的LLL。 解题思路 首先为了顺眼改一下变量名 Ax≡B(modP)A^x\equiv B(mod\ P)Ax≡B(mod P) 然后我们设xi∗t−j(0≤i≤t,0≤j≤t−1)xi*t-j(0\leq i\…

Oracle常用查询语句

Oracle常用查询语句 查看当前用户的缺省表空间SQL>select username,default_tablespace from user_users;查看当前用户的角色SQL>select * from user_role_privs;查看当前用户的系统权限和表级权限SQL>select * from user_sys_privs;SQL>select * from user_tab_p…

net的retrofit--WebApiClient库

# 库简介WebApiClient是开源在github上的一个httpClient客户端库&#xff0c;内部基于HttpClient开发&#xff0c;是一个只需要定义c#接口(interface)&#xff0c;并打上相关特性&#xff0c;即可异步调用http-api的框架 &#xff0c;支持.net framework4.5、netcoreapp2.0和ne…

P5021-赛道修建【平衡树,贪心,二分答案】

正题 题目链接:https://www.luogu.org/problemnew/show/P5021 题目大意 一棵树找mmm条不重边路径使得最短的那条最长。 解题思路 首先最小的最大显然二分一下答案。之后问题转换为找最多条长度不小于midmidmid的路径。 如果dpdpdp的话需要二维&#xff0c;显然不能胜任本题…

Sentinel(一)之简介

转载自 Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负…

使用xUnit为.net core程序进行单元测试(中)

第一部分: 使用xUnit为.net core程序进行单元测试(上), 下面有一点点内容是重叠的....String Assert测试string是否相等&#xff1a;[Fact]public void CalculateFullName(){var p new Patient{FirstName "Nick",LastName "Carter"};Assert.Equal(&quo…

P2048-[NOI2010]超级钢琴【RMQ,堆】

正题 题目链接:https://www.luogu.org/problemnew/show/P2048 题目大意 一个长度为nnn序列aaa。寻找kkk个子序列要求长度在L∼RL\sim RL∼R之间&#xff0c;求这kkk个子序列的最大和。 解题思路 首先对aaa求出前缀和数组sss。题目转换为求kkk个数对要求两两之间距离在L∼RL\…

Sentinel(二)之Quick Start

转载自 Sentinel Quick Start 1.1 公网 Demo 如果希望最快的了解 Sentinel 在做什么&#xff0c;我们可以通过 Sentinel 新手指南 来运行一个例子&#xff0c;并且能在云上控制台上看到最直观的监控和流控效果等。 1.2 手动接入 Sentinel 以及控制台 下面的例子将展示应用如…

hdu5115-Dire Wolf【区间dp】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid5115 题目大意 有nnn只狼&#xff0c;击败第iii只狼会扣aia_iai​加上于其相邻的狼的blbrb_lb_rbl​br​点hphphp。注意该狼被击败后会使原来于其相邻的狼变的相邻。 解题思路 显然区间dpdpdp&#xff0c;设fi,jf_…

.net的retrofit--WebApiClient库深入篇

前言本篇文章的内容是对上一篇.net的retrofit--WebApiClient库的深层次补充&#xff0c;你可能需要先阅读上一篇才能理解此篇文章。本文将详细地讲解WebApiClient的原理&#xff0c;结合实际项目中可能遇到的问题进行使用说明。库简介WebApiClient是开源在github上的一个httpCl…

Sentinel(三)之如何使用

转载自 Sentinel如何使用 简介 Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard&#xff0c;但是结合 Dashboard 可以取得最好的效果。 这篇文章主要介绍 Sentinel 核心库的使用。如果希望有一个最快最直接的了解&#xff0c;可以参考 新手指…

jzoj4485-[GDOI 2016 Day1]第一题 中学生数学题【数学】

正题 题目大意 给出n0,k,p0n_0,k,p_0n0​,k,p0​ 然后有两问&#xff0c;求 ⌊n0−kp⌋(p−p0)\lfloor n_0-kp\rfloor (p-p_0)⌊n0​−kp⌋(p−p0​)的最大值&#xff0c;ppp为任意实数。⌊n0−kp1⌋(p1−p0)(⌊n0−kp2⌋−n1)(p2−p0)\lfloor n_0-kp_1\rfloor (p_1-p_0)(\lf…

ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

上一篇ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ,我们说过ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础功能而已..所以今天我们主要讲讲如何采用Autofac来替换IOC容器,并实现属性注入注意:本文需要读者理解DI IOC并使用过…

Sentinel(四)之工作主流程

转载自 工作主流程 Overview 在 Sentinel 里面&#xff0c;所有的资源都对应一个资源名称&#xff08;resourceName&#xff09;&#xff0c;每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建&#xff0c;也可以通过注解的方式或调用 SphU API…

常用的依赖

<!--指定版本--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version><relativePath/></parent><!--引入插件lombok 自动的set…