随笔分类 -  算法与数据结构

总结算法与数据结构相关理论知识
摘要:学习yxc算法基础课记录,方便复习 贪心问题的应对思路:先从直觉上猜一个做法,然后设法验证 区间问题 区间问题大部分需要排序(将数据变成“单峰”的排布) 证明贪心问题的常用策略 a >= b && a ⇐ b ⇔ a == b 反证法 区间选点 将每个区间按照右端点从小到大排序 如果当前区间已经包含 阅读全文
posted @ 2021-05-03 00:12 呼_呼 阅读(60) 评论(0) 推荐(0)
摘要:树是一种特殊的图,树是无环图 无向图是一种特殊的有向图,相当于加一条反向的边 所以下面只考虑有向图的情况 图的存储 邻接矩阵 开一个二维数组,数组中的一个元素g[a][b]存储a到b的权重 适合存储稠密图,否则会有很多浪费空间 邻接表 每个节点开一个单链表,用来存储它直接指向的点 单链表内部顺序无关 阅读全文
posted @ 2021-04-24 12:16 呼_呼 阅读(128) 评论(0) 推荐(0)
摘要:DFS 想清楚几个关键点: 底层支持dfs的数据结构是栈,这个栈可以是系统自动帮我们提供和维护(递归写法),也可以我们自己来模拟(迭代写法) 注意任何时候栈里面维护的数据只是一条深度方向的路径,而不是维护整棵树,栈中的数据是动态更新的,代码处理技巧类似bfs给当前层级维护队列的技巧(之前有一次快手面 阅读全文
posted @ 2021-04-24 11:12 呼_呼 阅读(87) 评论(0) 推荐(0)
摘要:vector 变长数组 初始化方式 vector a(10, 3); //初始化,10个3 vector a[10]; 声明一个数组 支持的函数 size() 时间复杂度O(1) length() 同size() empty() clear() 并不是所有的容器都有这个方法 front(), bac 阅读全文
posted @ 2021-04-17 23:43 呼_呼 阅读(49) 评论(0) 推荐(0)
摘要:哈希表存储结构 最常用的两类:开放寻址法、拉链法 模拟散列表 拉链法 #include <iostream> #include <cstring> using namespace std; //做hash时整个数组的长度取成质数,同时这个数离2的幂次最远 const int N = 100003; 阅读全文
posted @ 2021-04-17 17:57 呼_呼 阅读(62) 评论(0) 推荐(0)
摘要:手写堆需要支持的操作 插入一个数 求集合当中的最小值 删除最小值 删除任意一个元素 修改任意一个元素 堆是一棵完全二叉树 大根堆和小根堆的特点 存储方式 用一个一维数组来存储 位置1存储根节点(下标从0开始需要特殊出根节点,因为0 * 2 == 0) 对于节点x,左儿子的下标为2x,右儿子的下标为2 阅读全文
posted @ 2021-04-17 16:38 呼_呼 阅读(108) 评论(0) 推荐(0)
摘要:题外:突然想起前两天百度暑期实习笔试第二题(n个比赛选手最开始均匀分配到n个准备区,之后有两种操作,一种是将两个准备区的选手合并到一个准备区,关闭其中一个准备区;第二种是查询两个选手当前所在准备区编号的距离)应该是考察并查集的,tmd又想了想这不就是裸题吗。。。当时没复习到完全没想到这茬儿,自己在那 阅读全文
posted @ 2021-04-17 14:59 呼_呼 阅读(61) 评论(1) 推荐(0)
摘要:实现Trie树 class Trie { public: struct Node { Node * son[26]; bool is_end; Node() { for(int i = 0; i < 26; i ++ ) son[i] = nullptr; is_end = false; } }*r 阅读全文
posted @ 2021-04-15 23:47 呼_呼 阅读(49) 评论(0) 推荐(0)
摘要:股票买卖Ⅱ 题目链接 //一个长线操作可以分解为该时间段内一系列连续一天的交易 //所以我们在考虑所有可能的收益时只需要考虑所有操作交易时间跨越的天数都为一的集合 //而所有操作时间跨越的天数都为一的交易两两之间是独立的 #include <iostream> using namespace std 阅读全文
posted @ 2021-04-15 21:14 呼_呼 阅读(44) 评论(0) 推荐(0)
摘要:KMP字符串 //时间复杂度O(n) #include <iostream> using namespace std; const int N = 100010, M = 1000010; int n, m; char p[N], s[M]; int ne[N]; int main() { cin 阅读全文
posted @ 2021-04-15 11:27 呼_呼 阅读(38) 评论(0) 推荐(0)
摘要:滑动窗口方法 参考了一位大佬的公众号文章,公众号名为“labuladong”,参考文章为《我写了套框架,把滑动窗口算法变成了默写题》 一、LeetCode 76: 最小覆盖字串(hard) 1. c++实现 ps: 刚开始刷题,很菜,本题代码自己先尝试写了一下,写出来后细节上问题很多,最后看着文章的 阅读全文
posted @ 2021-04-15 00:35 呼_呼 阅读(192) 评论(0) 推荐(0)
摘要:单调栈 最常用应用场景:找到每一个数左/右边离它最近的比它小/大的数 思考思路类似双指针,先考虑朴素暴力做法,再寻找特征,优化方案 单调栈 //ios比scanf和printf慢很多!!! #include <iostream> using namespace std; const int N = 阅读全文
posted @ 2021-04-14 11:48 呼_呼 阅读(83) 评论(0) 推荐(0)
摘要:链表 面试题中的链表一般用结构体来构造表示 struct Node { int val; Node *next; }; new Node(); //非常慢 笔试题中一般用数组模拟链表 用数组模拟单链表 用邻接表来模拟 邻接表一般用来存储树和图 静态链表 单链表 //静态链表 //用数组模拟链表,速度 阅读全文
posted @ 2021-04-14 10:45 呼_呼 阅读(91) 评论(0) 推荐(0)
摘要:离散化 将一个值域很大,但是分布很稀疏的数列压缩映射到一个更小的数组当中,后面处理时可以大大减小复杂度 保序的离散化 需要考虑两个问题: 原数组中可能有重复元素 如何快速算出x离散化后的值,二分 区间和 //将一个值域很大,但是分布很稀疏的数列压缩映射到一个更小的数组当中,后面处理时可以大大减小复杂 阅读全文
posted @ 2021-04-13 12:22 呼_呼 阅读(77) 评论(0) 推荐(0)
摘要:双指针的核心思想是优化时间,将朴素的两重循环O(n ^ 2)算法优化成O(n) O(n ^ 2) for(int i - 0; i < n; i ++ ) for(int j = 0; j < n; j ++ ) exec() 将上面的朴素算法优化成O(n) 双指针的通用框架 for(int i = 阅读全文
posted @ 2021-04-12 22:32 呼_呼 阅读(115) 评论(0) 推荐(0)
摘要:前缀和 对输入数组做预处理,可以快速求出数组中某连续一段元素的和 前缀和 //前缀和一定要让下标从1开始,便于定义s[0]; //定义s[0]是为了方便处理边界情况,类似于“哨兵”技巧的作用,统一用一套代码覆盖所有情况,避免特判 #include <iostream> using namespace 阅读全文
posted @ 2021-04-12 21:53 呼_呼 阅读(62) 评论(0) 推荐(0)
摘要:学习acwing《算法基础课》总结记录 大数超出了语言默认类型能表示的范围,需要特殊处理 将大数存到一个数组里面,先存低位,依次存储高位(四种运算用相同的思路) 高精度加法 A + B 人工模拟加法过程 #include <iostream> #include <vector> using name 阅读全文
posted @ 2021-04-12 19:48 呼_呼 阅读(109) 评论(0) 推荐(0)
摘要:练习 练习 输入 建议用while(cin)的形式 几乎所有的输入都是数字或者字符串,根据数字和字符串可以将输入分为几种情况: 1.先说数字(通常给定一组数,或者给定给一个数组) (1)直接输入一个数,对该数字进行一些操作,例如判断是否是素数,立方根等,这种类型只需要输入一个数即可,可用以下几种输入 阅读全文
posted @ 2021-04-11 12:18 呼_呼 阅读(960) 评论(0) 推荐(1)
摘要:1. 位运算常用技巧 整数n的二进制表示中,第k位是0还是1(注意个位对应第0位) //先把第k位移动到最后一位 n >> k //再看一下第k位是什么 n & 1 //合并在一起 n >> k & 1 lowbit(x):返回x的最后一位1 x & (-x) 也即 x & (~x + 1) //给 阅读全文
posted @ 2021-04-11 12:03 呼_呼 阅读(59) 评论(0) 推荐(0)
摘要:经典排序算法 1.冒泡排序 依次将未排序的最大元素放到序列尾部,就像水中的泡泡付出水面那样 #include <iostream> #include <algorithm> #include <vector> using namespace std; void bubble_sort(vector< 阅读全文
posted @ 2021-04-07 16:33 呼_呼 阅读(77) 评论(0) 推荐(0)