算法与数据结构
文章平均质量分 70
小小硕、
这个作者很懒,什么都没留下…
展开
-
算法小节Ⅱ
算法小节Ⅱ括号画家表达式计算括号画家达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。这一天,刚刚起床的达达画了一排括号序列,其中包含小括号( )、中括号[ ]和大括号{ },总长度为N。这排随意绘制的括号序列显得杂乱无章,于是达达定义了什么样的括号序列是美观的:(1) 空的括号序列是美观的;(2) 若括号序列A是美观的,则括号序列 (A)、[A]、{A} 也是美观的;(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的。例如 (){} 是美观的括号序列,而)({)[}](原创 2021-02-16 21:45:59 · 324 阅读 · 1 评论 -
kmp算法
KMP for (int i = 2, j = 0; i <= m; i ++ ) { while (j && p[i] != p[j]) j = ne[j]; if (p[i] == p[j]) j ++ ; ne[i] = j; } for (int i = 0, j = 0; i <= n; i ++ ) { while (j && s[i] != p[j])原创 2021-02-02 20:54:03 · 64 阅读 · 0 评论 -
二叉堆
二叉堆超市超市原创 2021-02-02 20:49:39 · 140 阅读 · 0 评论 -
Trie
Trie前缀统计最大异或对最长异或值路径前缀统计给定N个字符串S1,S2…SNS_1,S_2…S_NS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1~SNS_1~S_NS1~SN中有多少个字符串是T的前缀。输入字符串的总长度不超过106,仅包含小写字母。我们可以通过S1,S2…SNS_1,S_2…S_NS1,S2…SN建立一个trie树,标记每个字符串的结尾,然后对于给定的字符串进行查询,如果查询过程中遇到trie的结尾标记就将该结果相加。该算法的时间复杂度原创 2020-11-16 22:42:04 · 86 阅读 · 0 评论 -
Numpy学习——数组类型
Numpy学习——数组类型更多的数据类型转换(casting)不同数据类型的大小结构体类型处理丢失的数据更多的数据类型转换(casting)numpy会自动转换高精度数据类型:>>> np.array([1, 2, 3]) + 1.5array([2.5, 3.5, 4.5])赋值不会改变原有数据类型:>>> a = np.array([1, 2, 3])>>> a.dtypedtype('int32')>>> a原创 2020-09-27 16:17:12 · 451 阅读 · 0 评论 -
Numpy学习——科学计算
Numpy学习——科学计算Elementwise操作基本操作其他操作基本约简(reductions)计算总和其他约简Elementwise操作基本操作标量操作:>>> a = np.array([1, 2, 3, 4])>>> a + 1array([2, 3, 4, 5])>>> 2**aarray([2, 4, 8, 16])算术操作>>> b = np.ones(4) + 1>>> a -原创 2020-09-25 15:39:23 · 331 阅读 · 0 评论 -
链表
链表邻值查找邻值查找给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 Ai,求:1⩽j⩽imin∣Ai−Aj∣_{1\leqslant j\leqslant i}^{min}|Ai−Aj|1⩽j⩽imin∣Ai−Aj∣以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 Aj 较小的那个。如果暴力求解,遍历数列中的每个数,并搜索其与前面所有数的最小差值,则总的时间复杂度是O(n2)O(n^2)O(n2)。我们可以考虑借助链表,将原数列排序,用链表来原创 2020-09-21 21:36:14 · 55 阅读 · 0 评论 -
队列
队列小组队列蚯蚓双端队列最大子序和小组队列有n个小组要排成一个队列,每个小组中有若干人。当一个人来到队列时,如果队列中已经有了自己小组的成员,他就直接插队排在自己小组成员的后面,否则就站在队伍的最后面。请你编写一个程序,模拟这种小组队列。1、ENQUEUE x - 将编号是x的人插入队列;2、DEQUEUE - 让整个队列的第一个人出队;3、STOP - 测试用例结束可以采用一个小组队列和一个队列数组完成要求,小组队列记录小组编号的排序,队列数组记录每个小组的内部排序。#include原创 2020-09-14 14:43:42 · 142 阅读 · 0 评论 -
栈
栈包含min函数的栈编辑器火车进站火车进出站问题直方图中最大的矩形包含min函数的栈设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素利用一个辅助栈维护最小元素class MinStack {public: stack<int> s, temp; int min_x; /** initialize原创 2020-09-09 13:03:01 · 149 阅读 · 0 评论 -
基本算法小结
基本算法小结飞行员兄弟占卜DIY分形飞行员兄弟“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。已知每个把手可以处于以下两种状态之一:打开或关闭。只有当所有把手都打开时,冰箱才会打开。把手可以表示为一个4х4的矩阵,您可以改变任何一个位置[i,j]上把手的状态。但是,这也会使得第i行和第j列上的所有把手的状态也随着改变。请你求出打开冰箱所需的切换把手的次数最小值是多少。可以参考递推与递归中"费解的开关"以及位运算异或的知识。我们把所有可能的情况枚举,将二维矩阵压缩成一维原创 2020-09-02 11:05:30 · 254 阅读 · 0 评论 -
贪心算法
贪心算法防晒畜栏预定防晒有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的阳光。每头奶牛在日光浴前必须涂防晒霜,防晒霜有L种,涂上第i种之后,身体接收到的阳光强度就会稳定为SPF[i],第i种防晒霜有cover[i]瓶。求最多可以满足多少头奶牛进行日光浴。先将每头奶牛按照需要的minSPF排序。将防晒霜排序,从后向前遍历,如落在某头奶牛的minSPF、maxSPF区间内,则结果加+1,表示成下图。上面的小线段表示的就是每头奶牛的minSPF,maxSP原创 2020-08-29 15:32:59 · 419 阅读 · 0 评论 -
倍增算法
倍增算法给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下:从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整数不够 M 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值就称为集合 S 的“校验值”。现在给定一个长度为 N 的数列 A 以及一个整数 T。我们要把 A 分成若干段,使得每一段的“校验值”都不超过 T。求最少需要分成几段。看见“使得平方之和最大”、“最少需要分成几段”就能发现该题是求解最大最小问题,最开始想到的原创 2020-08-22 08:54:00 · 1768 阅读 · 0 评论 -
排序算法
排序)多级排序中位数问题均分纸牌问题多级排序莫斯科正在举办一个大型国际会议,有n个来自不同国家的科学家参会。每个科学家都只懂得一种语言。为了方便起见,我们把世界上的所有语言用1到109之间的整数编号。在会议结束后,所有的科学家决定一起去看场电影放松一下。他们去的电影院里一共有m部电影正在上映,每部电影的语音和字幕都采用不同的语言。对于观影的科学家来说,如果能听懂电影的语音,他就会很开心;如果能看懂字幕,他就会比较开心;如果全都不懂,他就会不开心。现在科学家们决定大家看同一场电影。请你帮忙原创 2020-08-21 08:56:35 · 242 阅读 · 0 评论 -
二分查找
二分查找算法二分查找算法模板整数二分实数二分三分法二分查找例题二分查找算法模板二分模板有两种,适用于不同情况。整数二分当区间[l, r]的更新操作是r=mid;l=mid+1时,计算mid不需要加1。int bsearch_1(int l, int r){ while(l<r) { int mid = l + r >> 1; if(check(mid)) r = mid; else l = mid + 1; } return 1;}当区间[l, r]的原创 2020-08-14 11:25:37 · 99 阅读 · 0 评论 -
前缀和与差分
前缀和&差分前缀和差分前缀和地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi。注意:不同目标可能在同一位置。现在有一种新型的激光炸弹,可以摧毁一个包含 R×R 个位置的正方形内的所有目标。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个正方形的边必须和x,y轴平行。求一颗炸弹最多能炸掉地图上总价值为多少的目标。前缀和的定义就是对于当前数组,第i个数以前的数的总和,形成一个新的数组,即前缀和数组。sum[i]=∑j=0inum[原创 2020-08-13 12:19:25 · 179 阅读 · 0 评论 -
递推与递归
递推与递归递归实现指数型枚举递归实现组合型枚举递归实现排列型枚举费解的开关奇怪的汉诺塔约数之和递归实现指数型枚举从1~n这n个整数中随机选取任意多个,输出所有可能的选择方案。#include <iostream>using namespace std;int n;//u代表当前进行的递归计数,state代表哪些数被选与未选void dfs(int u, int state){ //达到n时输出 if(u == n){ for(int i =0; i < n;原创 2020-08-10 10:07:42 · 167 阅读 · 0 评论 -
位运算
位运算C++位运算基本知识与或非异或补码按位取反左移、右移位运算例题快速幂最短Hamilton路径C++位运算基本知识与input_1input_2output000010100111// C++ a与b表示a & b或input_1input_2output000011101111// C++ a或b表示a | b非inputoutput原创 2020-08-02 23:06:23 · 104 阅读 · 0 评论