算法相关
记录自己刷题过程中碰到的有意思的玩意儿
也当作笔记使用
老是在本地记录不方便,自己搭不如直接用
屋顶上的蓝胖子
To be better
展开
-
背包问题经典例题
背包问题是经典的动态规划,分为0-1背包、完全背包和多重背包,0-1背包就是选或者不选,完全背包就是物品的数量是无限个,选择几个的问题。多重背包就是每一件物品的数量不同如何选择的问题。原创 2023-08-24 16:06:40 · 272 阅读 · 0 评论 -
牛客网 读取写入数据
牛客网写题与leetcode不同,并没有给输入的数据,而是需要自己从控制台地区并格式化。acm模式中的数据都是一行一行给的,所以可以这样一行一行的读取进来。原创 2023-08-24 14:49:35 · 272 阅读 · 0 评论 -
使用邻接表 表示图
到这里已经差不多够了,但是有一个关键的点就是这里只保存了边的编号以及这个边的下一条边(这个链表存储的是某个节点的所有边,所以这个”下一条“的意思并不是真的图中的下一条,仅仅是某个节点的所有的边组成的链表的下一条),没有保存这个边的另一头是哪个节点,所以虽然知道了某个节点的所有边的编号但是并不知道这个节点通过这个边可以去哪里,所以还需要一个数组来存储编号为i的边的终点是哪个节点,这样才能将整个图构建出来。另外,有的图的边是有权重的,所以可能还会在多一个数组w来存储编号为i的边的权重。原创 2023-06-27 10:18:40 · 385 阅读 · 0 评论 -
状态压缩 dp 状压dp
状态压缩,就是用用一个数来表示一个集合,并且实现基本的关于集合的操作,详见灵神的。原创 2023-06-18 19:32:08 · 115 阅读 · 0 评论 -
路径规划 Dijkstra和Astar算法 etc.
简单版的Djikstra算法(不使用小根堆)的算法并不难,本质上就是贪心,每一次都取距离出发点最近的点取它最近的边进行遍历,下面是。原创 2023-03-05 14:55:54 · 174 阅读 · 0 评论 -
二叉树的迭代式遍历
用了一种非常简单的方式区分已经遍历过的节点和没有遍历过的节点,这样就将三种遍历方式像递归那样统一起来了。如果使用dfs递归,代码很简单但是效率比较低,所以一定要记住二叉树三种遍历的迭代写法,当成板子记下来。下面这个是中序遍历,其他的只需要更换进栈的顺序即可。二叉树的三大遍历方式:先序、中序、后续。原创 2023-02-28 10:10:02 · 80 阅读 · 0 评论 -
最长、最短子数组问题
但是,给定的条件一般都满足某种情况使得我们可以使用双指针求解,最典型的就是上面M209这道题目,数组中的所有数都是整数,这意味着如果当前子数组中的数之和==target之后再添加到娥话子数组之和必然增加,不要看不起这个不起眼的条件,这个条件是使我可以在子数组之和 >= target之后从左边缩小子数组的大小。这种连续子数组的问题与以前那种常常想到的动态规划不同,这里不能使用dp,因为整个大问题不能拆分为为更小的问题,整个数组中的数据都是没有关系的。求某个数组中符合某个条件的最长/短子数组问题。原创 2023-01-16 19:16:49 · 208 阅读 · 0 评论 -
O(N)时间复杂度 求100万以内的所有质数
根据这个定理,可以一边求质数一边划掉他后面许多的合数,之所以这样划是因为这样的话所有的合数只会被划掉一次!所以是线性时间复杂度的!定义: 对于一个数x,所有原创 2023-01-02 20:31:08 · 236 阅读 · 0 评论 -
回溯
如果这两个2是一个,那就需要去重,去重的方法为先对nums进行排序,将相同的数全部放到一起,在for的时候,当当前的数==前一个数的时候直接continue,因为上一个2已经包括了我这个2的所有情况。使用回溯来排列,难点就是去重的问题,去重有两种,一种是不允许有任何重复的元素(其本身没有重复的元素),还有一种就是排序前的本身有相同的元素,但是排列的时候不区分它们,比如 1,2。关于排列的问题,回溯有着天然的优势,换句话说,对于排列的问题,第一个想到的就是回溯,, 2 和1, 2, 2。原创 2022-11-10 09:18:55 · 80 阅读 · 0 评论 -
搜索二叉树的增删改查
唯一的难点就是当当前节点就是要删除的那个节点时该怎么处理的问题。还有一种方式,当当前节点就是待删除的节点且左右子树都存在时,任命当前这个节点右子树中最小的那个节点为根节点,这个新的根节点的左子树就是原来根节点的左子树,这个新节点的右子树是原来根节点的右子树删除这个新节点之后的右子树(注意要求先求新节点的右子树在求新节点的左子树)当前节点就是要删除的那个节点时而且我左右子树都在的时候是最难想的,其实只需要把原来的头节点的右子树上的最小值(最左边那个)的左子树改成原来头节点的左子树即可。原创 2022-10-03 13:56:29 · 222 阅读 · 0 评论 -
素因子 质因数 第k个数问题
当某个数的素因子只包括a,b,c时,意味着这个数可以拆分成 a* b* c这一类题目普遍有两种做法,一是堆,二是动态规划。原创 2022-09-29 10:15:50 · 691 阅读 · 0 评论 -
求数组中前k个递增和后k个递减的问题
当我知道这一题的解法后,三分钟就能写出代码并通过,但是在我没有看灵佬的视频之前对这种题目毫无印象,好像从来没有写过这种题目,完全不知道从何下手,最后只好暴力,不必说,超时了。判断一个数组中,最长连续递增(这里是非递减)的长度是多少的问题,另一类还有比如判断第i个数前面有多少个数连续递增,第i个数后面有多少个连续的数递减。以上面的周赛题目为例,可以用递推先保存下第i个数前面有几个数非递增。原创 2022-09-26 11:06:15 · 140 阅读 · 0 评论 -
异或运算求数组中缺失或出现奇数次的数
但是还没有结束,如何求出这两个数分别是什么才是关键,由于这两个数不同,那么他们至少有一个比特位上不同,利用位运算求出是哪一位不同,假设是left_bit位不同,然后对数组中所有的数进行分类,第left_bit位是1的数分为一类A,第left_bit位是0的数分为一类B,将A和a进行异或就得到了第一个出现次数是奇数的数x1,同理得到x2。对于异或运算,首先得知道的基础是相同得数异或结果是0,0异或任何数都是这个数本身,异或满足交换律。原创 2022-09-26 10:38:44 · 188 阅读 · 0 评论 -
快速变换矩阵的行和列
【代码】快速变换矩阵的行和列。原创 2022-09-23 17:49:01 · 140 阅读 · 0 评论 -
python 自带二分函数 bisect 的使用
bisect_left, bisect_right需要单独引入,leetcode中已经默认引入了,只需要这两个函数只是返回索引,并没有真的将数。原创 2022-09-22 14:06:29 · 627 阅读 · 0 评论 -
最小操作次数问题
这种类型的题目关键是如何由当前状态推出下一状态,所有的状态都存在一个队列中,先进先出,遍历搜有的状态直到出现目标状态!关键就是如何求下一状态,以及要使用一个集合记录曾经出现过的状态防止重复出现浪费时间。原创 2022-09-21 09:42:38 · 165 阅读 · 0 评论 -
字典树 前缀树
使用哈希表表示节点属于进阶做法,一般情况下会使用[None]*26的列表来表示self.son,这样会浪费大量的时间和空间,但是对于理解字典树还是很有帮助的。字典树就是一个26叉树,但是下面的实现方式是使用的字典,不太好理解,因为它将字母以键的形式进行记录,而值却是一个新的节点。进阶一点的用法就是用哈希表(字典)替换列表,从而使占用的内存更小,速度更快。M208时前缀树的模板,但是实现起来优点冗杂。字典树可以用来快速的求解前缀相关的问题。原创 2022-09-19 19:04:01 · 94 阅读 · 0 评论 -
二叉树的层序遍历 宽度优先遍历
但是,当我需要单独处理每一层的数据时,如何将每一层的数据分开就会比较麻烦,所以可以使用一个level数组来替换上面的s数组来存放每一层的数据,而不是一个一个的添加。二叉树的层序遍历的理解一直模糊不清,虽然能写出来但是代码一一直很冗长!原创 2022-09-19 10:53:28 · 290 阅读 · 0 评论 -
线段树 区间修改树
简单来说,对于一个数组 arr = [1, 2, 3, 4, 5] 我需要求第1个到第3个元素的和,或者将第1个到第三个元素每一个数都加上12,或者将第1个到第三个元素统统改成8,这就叫处理一段区间的元素,当然,使用最传统的方法一个个遍历当然可以实现但是复杂度为O(n)级别的,需要一个个遍历,但是使用线段树就没有这么高的复杂度,当然实现起来比较麻烦,如果有板子就不一样了。线段树,又叫区间修改树,就是一个以满二叉树的思想管理的数组,可以区间管理一段数据的,能实现log n 时间复杂度的数据结构。原创 2022-09-12 21:37:25 · 661 阅读 · 0 评论 -
python 堆的使用 heapq
相关文章:,对于python来说就是一个按照特殊顺序排列的列表,在python中有专门的包heapq来实现关于堆的一系列操作,堆最重要的性质就是它的第一个元素一直是整个列表中最大/最小的那个,比不停的使用min要快得多python中的堆默认是小根堆,也就是所有的父节点的值都小于它的子节点,实际上的实现就是第i个元素的值要小于第2i+1个个第2i+2个。原创 2022-09-09 09:16:33 · 619 阅读 · 0 评论 -
二叉树的序列化
二叉树的序列化原创 2022-09-05 10:51:47 · 253 阅读 · 0 评论 -
单调栈 最近的更大/更小元素位置
单调栈就是栈,分为单调递增栈和单调递减栈,以递增栈为例,简单来说,有一批数 [1, 2, 4, 3],按顺序一个个入栈,如果待入栈的元素比栈顶的元素小则将栈顶元素弹出,一直弹出到栈顶的元素比待入栈的元素小或者弹空了,再将这个待入栈元素入栈。)该数的下标从而计算这个数有效的范围是多少,就这题而言,我需要知道每一个数的辐射范围从而计算贡献值,但是又不能重复计算,所以将左边的边界设置为大于等于,一般情况下是严格的大于或小于。单调栈一般用来完成下一个最大/最小数之类的问题,因为它能记住上一个最大/最小数的位置。..原创 2022-08-31 18:40:11 · 229 阅读 · 0 评论 -
珂朵莉树 老司机树 区间合并
使用有序字典(SortedDict)存储区间的结束和开始(注意是反的!key是区间的结束,value是区间的开始)。当有新的区间输入时,从头到尾一个个的遍历字典(为了节省时间,一般采用二分直接找到第一个>=传入left的地方再开始遍历),只要有重复的部分就将这个区间合并(其实就是删除这个区间并更新left和right)。: 区间合并,当数据量大到差分数组之类的常规解法无能为力的时候。简单来说就是合并区间,并计算区间内数的个数。...原创 2022-08-30 19:07:03 · 99 阅读 · 0 评论 -
python 实现 Cmn 的排序 阶乘 排列 组合
我这个目前用的优点难使用,m是m,但是k不是n,k是一直阶乘到几,比如。并不是5向下乘k次,所以使用的时候有点麻烦,第二个参数是 m-a。上面是m阶乘n次,下面是n的阶乘。方法一:普通的的循环。...原创 2022-08-26 16:08:46 · 2263 阅读 · 0 评论 -
求集合中的所有子集
求子集原创 2022-08-23 17:00:43 · 596 阅读 · 0 评论 -
数位DP
灵神关于数位Dp的讲解板子以及题目:关于数位Dp的文章:原创 2022-08-21 22:21:36 · 369 阅读 · 0 评论 -
图的深度优先遍历方式 Python
构造的简单版本是构造一个列表,但是仅限于简单的图,应付中等左右的题目足够了。图的构造和遍历简单版没有那么复杂!图的深度优先遍历函数 dfs。原创 2022-08-07 21:09:04 · 1255 阅读 · 0 评论 -
算法相关的博弈
其他的数字异或运算要先转换成二进制才可以!所有堆石子的数量的异或!python异或运算符就是^n堆石子,第i堆有a。原创 2022-07-27 12:21:54 · 604 阅读 · 0 评论 -
求最大公约数
2/6,用上面的方式计算出来的最大公约数是-2,你把-2/6上下同除以-2就成了1/-3,这是部不对的,所以记得将求出来的最大公约数来一个abs。你咋知道要上下同时除2,因为2是6和2的最大公约数。最大公约数,在化简分数时会用到。比如2/6=1/3。...原创 2022-07-27 12:21:31 · 99 阅读 · 0 评论 -
二叉树某一结点的路径
最近公共祖先二叉树的路径。原创 2022-07-20 21:00:12 · 286 阅读 · 0 评论 -
Python 中实现滑动窗口
普通的滑动窗口一步一步走浪费时间,应该注意到,滑动窗口每一次仅移动一格,左边踢出去一个右边进来一个,所以不用每一次都从头开始,可以只处理变化的两端例题: leetcode这一题用我自己的滑动窗口方式也是可以的,但是超时了!!!!!换成大佬的滑动方式:还是要多看大佬的解析视频啊!...原创 2022-07-13 11:21:13 · 2363 阅读 · 3 评论 -
差分数组及使用
B站讲解差分数组及应用最常用的就是修改数组中的数,一段一段的修改,每一次的修改都是独立的比如:list = [1, 2, 3, 4, 5, 6]修改一: 0-2 统统加1修改二: 1-3 统统减1问这个数组变成啥样了?什么是差分数组?原数组 [1, 2, 3, 4, 5, 6]它的差分数组就是 除第一个不变外 后一个减去前一个形成的新的数组[1, 1, 1, 1, 1, 1]什么是前缀和?先要有个差分数组,后一个加前一个得到的数组就是前缀和[1, 1, 1, 1, 1, 1] ->>>原创 2022-06-21 15:54:39 · 355 阅读 · 1 评论 -
Sprague_Grundy定理 先挖个坑
力扣上这一题不是简单的dp,要用到题目里面的定理和记忆化、搜索状态压缩啥的暂时还没有了解的原创 2022-05-31 09:53:49 · 75 阅读 · 0 评论 -
继续挖坑 BFS广度优先遍历查询迷宫问题
BFS广度优先遍历对于矩阵中某个点能不能到另一个点以及最短路径之类的问题能比较好的解决,继续挖个坑原创 2022-05-31 09:53:05 · 61 阅读 · 0 评论 -
拓扑排序 Topological Sorting
什么是拓扑排序:相关Leetcode题目:剑指offerⅡ114继续挖坑,完犊子了,坑挖的越来越多填不上了。。原创 2022-05-31 09:51:27 · 97 阅读 · 0 评论 -
leetcode H668乘法表中第k小的数
常规暴力肯定是通不过的,数据太多了,将所有数据存进一个列表然后排序找到第k个是最直观的思路,但是不行,这限制了我之后的想法,一直想着先处理好数据,先对乘法表中的数据进行啥样的操作然后一下找出对应的结果,这样是写不出来的二分法二分是我刚接触的算法,它是反的,像是暴力循环一样,其实就是暴力循环,只不过每次取一半把数据变少了。拿1 22 4 k=3这个乘法表举例子,首先创建一个1234这样的列表,然后从1开始,这个表中小于等于1的数有1个(注意,如何判断一个乘法表中小于等原创 2022-05-18 18:17:09 · 845 阅读 · 0 评论 -
位运算 与 异或
常见的位运算 及 leetcode题目按位与 &将数转为二进制,只有全为1时才为1,否则为0,对于多个数运算也是如此:1111111000101000110001100将上面4个数&得到的结果就是000100,因为只有右数第3位从上到下都是1,所以对于leetcode 6065就变得非常简单,只要将所有的数字都转换成2进制,一位一位的找,哪一列1最多那答案就是这一列对应的1的个数。这一题如果知道这个按位与的计算原理就非常简单,唯一的难点就是怎么找每一列对应的1的个数!原创 2022-05-16 09:28:01 · 139 阅读 · 0 评论 -
leetcode三数之和 M015
leetcode M015三数之和解法的本质就是暴力循环方法一、纯暴力原始的暴力循环N^3时间复杂度,代码如下:很显然超时了 def threeSum(self, nums: List[int]) -> List[List[int]]: n = len(nums) ans = [] if n<3: return [] for i in range(n-2): for j原创 2022-05-13 15:19:37 · 886 阅读 · 0 评论 -
链表反转 递归和迭代
leetcode e 206leetcode 第206题 反转链表简单题,但是其中的递归法不太好理解方法一、迭代法迭代法非常简单,两个变量,一个记录上一个节点,一个记录当前节点。但是有个注意的点,进入循环后第一步就是要记下原来cur.next的值,因为后面会改变但是又要通过它前进所以要先记录下来: def reverseList(self, head: ListNode) -> ListNode: pre, cur = None, head while原创 2022-05-12 15:23:01 · 159 阅读 · 0 评论 -
二叉树的序列化与反序列化 H.297
leetcode H297方法一:DFS(深度优先遍历)二叉树的DFS序列化很简单,无非就是先序遍历还是后序遍历的选择问题,唯一需要注意的就是输出的字符串的格式问题,这会直接影响到反序列化的操作1、序列化以后我统一使用先序遍历,因为这样根节点就是第一个元素,一路往后即可 def serialize(self, root): if not root: # 注意n后面有一个逗号 return 'n' left = self原创 2022-05-11 18:48:40 · 153 阅读 · 0 评论