数据结构
文章平均质量分 75
1
Gh0st_Lx
ACMer蒟蒻 / 北航研0
展开
-
算法学习笔记(2):Trie树【字典树】
Trie树前言Trie树,又称字典树、前缀树。主要用于解决统计、排序和存储大量的字符串但是不仅限于字符串,比如一个数,它的二进制形式可以看成一个仅由0和1组成的字符串,如果一个trie仅由这些二进制的字符串组成,那么这棵树称为01trie树故有很多位运算(异或)的问题也可以用trie树解决指01tire树核心思想根节点为空,除根节点以外每个节点只包含一个字符从根节点到某一个有标记的节点,路径上经过的字符连接起来,为该节点对应的字符串为什么是有标记?比如我只有一原创 2022-01-21 17:25:42 · 165 阅读 · 0 评论 -
Dijkstra堆优化(pbds版本priority_queue)
背景防止赛场上面被卡SPFA,且效率更高更稳定测试测试了STL的,和pbds的优先队列,在Dijkstra堆优化中谁更快对照实验,除了用的容器不同,其余代码段全部一致,保证了只受到STL和pbds影响,都不开O2,都用了快读,用了vector邻接表。题目链接:洛谷P4779 【模板】单源最短路径(标准版)STL,初始堆中只有一个元素(起点):141-252msSTL,初始堆中有n个元素:238-384mspbds,初始堆中只有一个元素(起点):62-110mspbds,初始堆中原创 2021-09-30 16:13:28 · 864 阅读 · 0 评论 -
剑指offer28 数组中出现次数超过一半的数字
目录算法一:哈希映射算法思路复杂度分析使用map使用unordered_map代码实现算法二:排序算法思路代码实现C++Python3复杂度分析算法三:性质构造法算法思路代码实现复杂度分析算法一:哈希映射算法思路开一个map容器或者是unordered_map容器来记录一个数出现的次数,最后在逐个访问容器中的元素,找到比⌊len2⌋\lfloor \cfrac{len}{2} \rfloor⌊2len⌋大的那个就行了复杂度分析值得注意的是map和unordered_map内嵌数据结构是不同原创 2021-07-21 17:24:09 · 87 阅读 · 0 评论 -
NC632 牛牛摆木棒
题目陈述大意:定义波浪形序列为:序列中间的每个数都大于他的相邻的数或者小于他相邻的数。大小定义为字典序大小,求长度为n的序列中第k个波浪型的序列。算法一:朴素算法算法思路一个很显然的思路,就是暴力枚举,字典序递增算出每一个序列,直到第k个开一个vector来记录当前的序列,第i层代表当前要填写的是第i个数字,那么递归边界就是n+1层(前面n个数字都已经填写完毕)那么我们该如何按字典序搜索?对于同一个位置填写的i,下一个位置如果填写的下降的,显然比上升的字典序来的小,所以应该先搜索下降的,再搜索原创 2021-07-15 22:55:19 · 209 阅读 · 0 评论 -
剑指offer35_数组中逆序对
题目陈述大意:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007算法一:朴素做法算法思路最显然的思路就是枚举,枚举第i个数,下标比他大的所有数中,其数字比他小,则ans就+1,即下标[i+1,n)[i+1,n)[i+1,n)中比a[i]小的数的数实际上,冒泡排序的交换次数,就是该逆序对的对数算法时间复杂度O(n2)O(n^2)O(n2)代码原创 2021-06-24 16:12:17 · 75 阅读 · 0 评论 -
NC82--滑动窗口的最大值
一、题目描述原题链接:点这里题目大意:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值,窗口大于数组长度的时候,返回空。二、算法一:暴力算法思路如果num数组为空,或者num数组长度小于窗口长度,或者窗口长度非正,这些情况都没有区间最大值,则直接返回一个空的vector当然,你可以直接写vector<int>(),但是常数很大,很耗费时间,所以我们在代码前面定义一个ans,此时直接返回遍历num数组,依次计算以i为左端的窗口的最大值,边界条件是窗口右端<num.原创 2021-06-16 21:29:42 · 139 阅读 · 0 评论 -
lab(fib生成树)
题目题目大意:给定一个图,里面只有0或1 两种权值的边,求这个图的生成树中,是否有权值是斐波那契数的生成树算法思路算出 最小生成树的值Mi,再算出最大生成树的值Mx预处理fib数组,二分判断[Mi,Mx]其中是否有fib数有则,输出Yes,否则输出No...原创 2021-05-23 23:22:31 · 148 阅读 · 0 评论 -
(LR机器人爆炸)CF1525C(括号匹配)
题目CF1525C :点这里题目大意:给定n,m,其中n代表机器人,m代表边界,每个机器人有方向L,R,走到同一位置上面会爆炸,走到0或边界m上面,下一秒会改变方向返回,最后输出每个机器人爆炸的时间算法思路括号匹配思路,用堆栈来做,L相当于右括号,R相当于左括号,对撞相当于匹配只有坐标的奇偶性相同,才有可能对撞,因为同向移动,距离改变0,异向移动,距离改变为-2或+2,奇偶性永远不会改变,所以只需要针对奇偶性,分开处理坐标为奇数,和坐标为偶数的即可将坐标按照从小到大排序一遍,然后i从1到n开始原创 2021-05-17 10:58:00 · 731 阅读 · 0 评论 -
(是否是合法堆)lab9_Is_a_heap
题目算法思路自己刚刚拿到题目的时候,因为树是可以旋转的,第一反应是全部找到所有最小值,再全部找到所有最大值,然后以其为根进行判断,后面发现可能有多个最大值和最小值,构造一组数据,有5k个最大值和5k个最小值,可以把自己原来的算法给卡掉,后面根据堆的性质,判断连边为2的节点,才可能是堆,这样就优化了算法接下来只需要以度为2的节点为根,判断他是否是一个合法的堆即可以,因为复杂度问题,判断是否是大小根堆的复杂度,明显小于判断是否是完美二叉树的,所以我们先判断是否是大小根堆判断大小根堆很easy的,原创 2021-05-15 22:06:55 · 127 阅读 · 0 评论 -
英语数字转换器(栈)
题目原题链接点击这里样例输入sixnegative seven hundred twenty nineone million one hundred oneeight hundred fourteen thousand twenty two样例输出6-7291000101814022算法思路( I )数据的读入因为是多行数据,每行有多个字符串,我们采用先将一行的字符串读入字符串Line中,然后将Line传入流stringstream中,再将stringstream中的一原创 2021-05-02 21:46:17 · 262 阅读 · 0 评论 -
银行排队问题之单队列多窗口加VIP服务 (30 分)
题目链接原题地址:点这里思路模拟题,在原先没有vip的基础上面改动,以后写这种模拟题的时候,记得txt拿出来把思路捋清楚了再写代码,一般这种模拟题都有个某种的优先级最高,搞清每次操作的时候优先的顺序,我这一步之前还有没有东西要特判的其次就是我要设置多少变量,过多变量的时候容易i,j,b,x,y给混淆掉,这一点一定要清晰goto JUMP的话以后记得写在初始化的前面,就是要注意初值问题写这题代码的时候没有及时出队的情况,有时候要对比,不同的代码块,寻找相似的规律,然后也是帮助发现bugqu原创 2021-05-02 03:21:28 · 577 阅读 · 0 评论 -
列车调度(贪心)
题目原题链接: 点击这里思路只需要记录队尾的元素即可 ,因为输出要求递减,则维护从大到小的队列即可为何是贪心?选择第一个大于它的值即可,贪心思路,留给其他后续X的机会更大例如插入1,8,7现在有队列9 2插入1 9的话,则后面8 7 就必然要再开一个队列,必然不是最优的了详细证明依旧用替换法,证明贪心策略不会比最优解劣代码实现#include<bits/stdc++.h>#include<unordered_map>#include<unorder原创 2021-05-01 16:55:54 · 117 阅读 · 0 评论