Skip to content

MarklearnML/Leetcode

Repository files navigation

目录

数组/字符串

双指针:快慢指针,头尾指针

双指针

滑动窗口

矩阵

哈希表

哈希表的类型:数组、set、map

区间

栈和队列

栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中是不是连续分布。
缺省情况下,默认底层容器是deque,那么deque的在内存中的数据分布是什么样的呢? 答案是:不连续的,下文也会提到deque。
经典例题:括号匹配问题、栈在系统中的应用、滑动窗口最大值、前k个最值、字符串去重问题

链表

链表的类型: 单链表、双链表、循环链表
链表的操作:增删改查

二叉树

题目跟一层有关的均可用层次遍历(例:层里最大值,层里平均值,右视图,左视图)
二叉搜索树的中序遍历是有序的

回溯

排列和组合,所有需要暴力枚举的题目都可想到回溯,回溯无非就是暴力枚举+剪枝

贪心算法

贪心的题目如果不要求顺序,先排序可能更好做
一次遍历,二次遍历

分治

查找

动态规划

涉及一个数组分成两份重量相同或最近的两个子数组的题,想到01背包。
完全背包问题,如果是组合数,那么外循环是物品,如果是排列数,那么外循环是背包。

背包问题

问能否能装满背包(或者最多装多少)对应题目如下:

问装满背包有几种方法 对应题目如下:

问背包装满最大价值 对应题目如下:

问装满背包所有物品的最小个数 对应题目如下:

打家劫舍

买卖股票的最佳时机

买卖股票的套路即分别记录各个状态下的最大现金,一般的状态有:持有股票、未持有股票、第i次持有股票、第i次未持有股票、冻结期等

子序列问题

子序列问题最主要是dp如何定义,一般定义dp[i]为以num[i]元素为结尾的子序列

编辑距离

回文子序列

也可以用双指针做回文问题,具体就是重中点想两边扩散 判断是否是回文串

单调栈

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)
接雨水和柱状图中最大的矩形有所不同,接雨水是找到左边最大和右边最大的下标,或者找到左边第一个大和右边第一个大的下标。柱状图是找到左边第一个最小和右边第一个最小的下标。
单调栈的目的是找到右边第一个最大/最小的下标,同时也可以找到左边第一个最大/最小的下标,前者是入栈的元素,后者是还在栈内的元素。(为了所有元素都涉及到,前后都得插入最大/最小值~0)

图论

并查集

三个作用:查找一个点的根节点,判断两个点是否一个集合(两个点的根节点是否相同),将两个节点接入到同一个集合
无向图计算冗余线时只需找相同根就行,而有向图则是判断是否有入度为2或者成环,冗余线在上述两种情况

额外题目

前缀和

当数组全为正时,需要找到某个连续子数组的和是否等于k时,可以用滑动窗口;当数组有正有负时,滑动窗口不适用,可以用map记录前i个数组的和,那么j-i连续子数组的和为后一段减前一段
哈希表里不一定放的是pre,可以是余数,可以是平均数等等, 主要看sum2-sum1这个公式如何推导

排序

真题

*小美的树上染色 树除了二叉树基本都是用图的结构,从子节点(入度为1)进行拓扑遍历 存储图结构一般用邻接矩阵(二维数组) 邻接列表(包含列表的列表) 边列表(包含所有边的列表)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published