算法
Yair_
这个作者很懒,什么都没留下…
展开
-
并查集
每次询问都将这一结点的父节点改为根结点。这样询问某一结点的树根(即询问该结点属于哪一集合),时间复杂度可以近似O(1)。每个集合用一颗树来表示,树根的编号就是整个集合的编号,每个结点存储它的父结点。比如:p[x] 表示 x 的父结点。每次寻找一结点的树根,也就是询问这个结点的集合,都需要依次向上遍历,这里可以采取。上面这一行代码表示:将a属于的集合的树根,链接到b属于的集合的树根下。p数组表示父结点,比如:p[x] 表示 x 的父结点。当 p[x] == x 时,表示 x 的父节点是树根。原创 2024-06-18 19:42:08 · 351 阅读 · 0 评论 -
用数组模拟堆
PS:: 当删除任意一个元素和修改任意一个元素时,当前这个位置的元素无非就是比之前的元素大或小或者相等,直接使用down和up;不需要进行判断,精简代码。4、删除任意一个元素 heap[k] = heap[size];也可以设堆顶的下标为0,但是左儿子下标为 2 * i + 1;使用数组模拟堆,堆顶的下标为1,左儿子下标为 2 * i;3、删除最小值 heap[1] = heap[size];1、插入一个数 heap[++size] = x;并且通过儿子下标找父亲下标有点麻烦:(i - 1) >> 1。原创 2024-06-20 20:32:42 · 206 阅读 · 0 评论 -
Trie
Trie的作用:高效的存储和查找字符串。原创 2024-06-18 12:58:52 · 189 阅读 · 0 评论 -
排序加去重
返回的是一个迭代器,当然不止可以使用于vector。返回vector的不重复的区间的最后一个元素的下一个位置的迭代器。当然啦,使用这个函数的前提是对数组进行排序,这样才能达成去重+排序的效果。还可以使用unique函数进行去重。unique函数的模拟实现。可以使用STL容器set。原创 2024-06-16 23:24:14 · 67 阅读 · 0 评论 -
数组模拟栈和队列
qu数组存储队列的元素,head存储队头的下标,qt存储队尾的下标。stk数组存储栈中的数据,tt指向栈顶的元素下标。原创 2024-06-15 15:10:06 · 189 阅读 · 0 评论 -
数组模拟单链表和双链表
单链表主要有三个接口:头插,删除,插入(由于单链表的性质,插入接口是在结点后面插入)原创 2024-06-15 14:34:19 · 313 阅读 · 0 评论 -
前缀和
前缀和的作用是求一个数组中一段区间的和。原创 2024-06-11 13:32:58 · 257 阅读 · 0 评论 -
快速幂
将 b 转换为二进制来考虑,假如 b = 8;b 的二进制表示:1100;对应 8 4 0 0。给定整数 a b q, 求 a 的 b 次方 mod q。2、不能循环 b 次计算 a 的乘积,会超时。每计算一次 a 的乘积,就 mod q。根据题目数字取值范围,不能暴力处理。1、计算 a 的次方会超出范围。原创 2024-06-01 21:50:52 · 187 阅读 · 0 评论 -
单调栈
单调栈就是用来存放已经遍历过的元素。当解决问题需要记录前面的元素,这个时候就需要用到单调栈。比如求一个数组中一个元素后面第一个大于它的元素。可以使用暴力去遍历,但是会出现重复判断,性能不优。这个时候用一个单调栈来存放已经遍历过的元素。这样来看我们可知根据题目要求,单调栈里面可以存放元素的下标也可以存放元素值。原创 2024-04-30 22:33:08 · 111 阅读 · 0 评论 -
图论题集
给定一个graph,题目要求从结点0到n - 1的结点的所有路径。这个n指的是graph的行下标。拿一组测试用例来说明吧。不然不好理解题意题目大致就是这么个意思。题目保证了输入为有向无环图。那么就可以确定,一定会有结点0到n的路径。这很辛苦,但我觉得对于初学者来说,很有必要。一步一步分析递归和回溯,这样才能更好的理解dfs。多分析个几次,就回慢慢变快了。原创 2024-04-30 22:32:33 · 197 阅读 · 0 评论 -
二分查找(个人笔记)
2、right = mid 还是right = mid - 1:因为是右边是闭区间,所以这里的right是可以取到的,nums[mid]已经判断是不是target的下表,所以下一次要在mid之前搜索,所以是right = mid - 1.假如是左闭右开, 这里right就取不到了,所以是right = mid,因为是左闭右闭,所以left == right是合法的,所以是<=。假如是左闭右开,这里right就取不到了,所以是<。原创 2024-03-10 21:40:00 · 193 阅读 · 1 评论 -
KMP算法
前缀表(prefix table) :前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。而前缀表内存储的是最长相等前后缀(这里我们定义它为next数组)比如aadaaf:a 前缀: 后缀: 0aa 前缀:a原创 2024-03-18 08:58:40 · 541 阅读 · 0 评论 -
在C语言中,x的n次方表示
返回类型是double,在注意使用它的时候是否需要强制类型转换。for example:12345%((int)(pow(10,3)).这里进行取余(%)操作时,两个操作数需为整型(int)。利用pow(x,n)函数。它的完整型是:double pow (double x,double n) 头文件是#include<math.h>原创 2023-12-18 22:15:00 · 1104 阅读 · 0 评论 -
贪心题集
这道题就是要求给定的数组中的峰值数以及端点。把数组抽象成折线图会好理解一些,那么根据题意,我们就需要判断这些相邻的数的差值,不妨设pre_diff = nums[i] - nums[i - 1],cur_diff = nums[i + 1] - nums[i]。那么出现峰值的条件为那么就需要三个数来计算,但是数组假如就只有两个数呢?我们在数组的第一个元素之前引入一个相同的数,所以在开始状态pre_diff = 0。那么就需要修改判断峰值条件了这样就包括了只有两个元素的情况。原创 2024-04-03 20:07:48 · 634 阅读 · 1 评论