09 2024 档案
构建前缀信息解决子数组问题
摘要:构建前缀信息解决子数组问题 303. 区域和检索 - 数组不可变 #include <vector> using namespace std; class NumArray { public: // 前缀和数组 vector<int> prefixSum; NumArray(vector<int>
二叉树高频题(下)
摘要:二叉树高频题(下) 236. 二叉树的最近公共祖先 using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), ri
二叉树高频题(上)
摘要:二叉树高频题(上) 102. 二叉树的层序遍历 #include <vector> #include <iostream> #include <algorithm> #include <queue> using namespace std; struct TreeNode { int val; Tr
链表高频题
摘要:链表高频题 160. 相交链表 #include <vector> #include <iostream> #include <algorithm> struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(N
数据结构设计
摘要:数据结构设计 设计有setAll功能的哈希表 加时间戳 #include <vector> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; // <key, <val, ti
堆
摘要:堆 912. 排序数组 #include <vector> using namespace std; class Solution { public: // 自上而下调整大顶堆,O(logn) void adjustHeap(vector<int> &nums, int len, int curIn
前缀树
摘要:前缀树 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值
快速选择
摘要:快速选择 215. 数组中的第K个最大元素 时间复杂度 O(n),空间复杂度 O(1) #include <vector> #include <cstdlib> #include <ctime> using namespace std; class Solution { public: int qu
快排
摘要:快排 快速排序的最优情况是每一次取到的元素都刚好平分整个数组,T(n) = 2 * T(n/2) + O(n),由 master 公式得到算法的时间复杂度为 O(nlogn),空间复杂度为 O(logn) 最坏情况是数组本身有序,每一次取到的元素都是待排序列中的最值,效果相当于冒泡排序。这种情况下,
归并分治
摘要:归并排序 912. 排序数组 #include <iostream> #include <vector> using namespace std; class Solution { public: // 分治-治 void merge(vector<int> &arr, int left, int
一维差分和等差数列差分
摘要:一维差分 不支持边操作边查询 对于数组 a,定义其差分数组(difference array)为 i = 0 时,d[i] = a[0]; i > 0 时,d[i] = a[i] - a[i-1]; 性质 1:从左到右累加 d 中的元素,可以得到数组 a。 性质 2:如下两个操作是等价的。 区间操作
Chirpy+Github
摘要:相关网址 Chirpy 示例:网页上有官方教程,我写的肯定不全 Chirpy 示例仓库:这个就是包含官方教程的那个示例的仓库 Chirpy 模板仓库:直接 fork 这个仓库,快速搭建,没有多余的东西 Real Favicon Generator:生成图片替换原来的蚂蚁图片 fontawesome:
md转换成_post下直接使用的文件
摘要:md转换成_post下直接使用的文件 package org.example; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.charset.Stan
位运算实现加减乘除
摘要:29. 两数相除 #include <iostream> using namespace std; class Solution { public: int add(int a, int b) { int res = a; while (b != 0) { // 无进位相加的结果 res = a ^
位运算
摘要:异或运算 异或运算就是无进位相加 异或运算满足交换律、结合律 0^n = n,n^n = 0 整体异或和为 x,整体中某个部分的异或和为 y,那么剩下的部分的异或和为 x^y。即若 a^b = c,则 a = c^b,b = c^a 交换两个数 #include <iostream> #includ
A星、Floyod、Bellman-Ford
摘要:A 星算法 A 星和 Dijkstra 算法唯一区别在于堆中排序的依据。distance 数组仍然保存实际代价,预估代价只影响堆的弹出顺序。 Dijkstra 根据源点到当前点的实际代价进行排序。 A 星根据源点到当前点的实际代价 + 当前点到终点的预估代价进行排序 预估函数要求:当前点到终点的预估
扩点最短路
摘要:扩点最短路 不把实际位置看作图上的点,而是把实际位置和该位置的所有状态的组合看作是图上的点,BFS 或者 Dijkstra 的过程不变,只是增加了一些点。 864. 获取所有钥匙的最短路径 #include <iostream> #include <vector> #include <algorit
Dijkstra 算法
摘要:普通堆实现的 Dijkstra 算法 时间复杂度为 O(m * logm),m 为边数 distance[i] 表示从源点到 i 点的最短距离,visited[i] 表示 i 节点是否从小根堆弹出过 准备好小根堆,小根堆存放记录:(x 点,源点到 x 的距离),小根堆根据距离排序 令 distanc
位图
摘要:位图 用 bit 组成的数组来存放值,用 bit 状态 1,0 代表存在不存在,取值和存值都用位运算。限制是必须为连续范围且不能过大。 实现 // 初始化位图大小,只支持 0 ~ n - 1 所有数字的增删改查 void Bitset(int n); void add(int num); void
双向广搜
摘要:双向广搜 用途一:小优化 BFS 的剪枝策略,分两侧展开分支,哪侧数量少就从哪侧展开 用途二: 特征:全量样本不允许递归完全展开,但是半量样本可以完全展开。(完全展开的过程中有可能能够进行分组,进行常数级优化) 过程:把数据分成两部分,每部分各自展开计算结果,然后设计两部分结果的整合逻辑 127.
图的广度优先遍历
摘要:图的广度优先遍历 1162. 地图分析 #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; class Solution { public: int rows
最小生成树
摘要:最小生成树 最小生成树(英语:Minimum spanning tree,简称MST)是指在无向带权图中选择一些边,在保证连通性的情况下,边的总权值最小 最小生成树不唯一 如果无向带权图有 n 个点,最小生成树一定有 n-1 条边 P3366 【模板】最小生成树 Kruskal 算法 把所有的边,根
拓扑排序
摘要:拓扑排序 LCR 113. 课程表 II #include <iostream> #include <vector> #include <queue> using namespace std; class Solution { public: vector<int> findOrder(int nu
建图
摘要:建图 邻接矩阵 #include <iostream> #include <vector> using namespace std; // 点的最大数量 int MAX_N = 11; // 邻接矩阵方式建图 vector<vector<int>> graph(MAX_N, vector<int>(
洪水填充
摘要:洪水填充 设置路径信息进行剪枝和统计,类似感染的过程 路径信息不撤销,可以保证每一片的感染过程能够区分开 遍历次数和样本数量的规模一致 200. 岛屿数量 #include <iostream> #include <vector> #include <stack> #include <algorit
并查集
摘要:并查集 一开始每个元素都以自己为一个集合 find(i):查找 i 所在集合的代表元素,代表元素代表了 i 所在的集合 isSameSet(a, b):判断 a、b 是否在同一个集合里 union(a, b):将 a、b 所在的两个集合合并 并查集的实现 #include <iostream> #i
单调队列
摘要:单调队列 经典用法:维持滑动窗口滑动过程中的最大值或最小值。最大值时,单调队列从头到尾降序 维持求解答案的可能性 单调队列里所有对象按照规定好的单调性组织 当某个对象从队尾进入单调队列时,会从队头或者队尾依次淘汰单调队列里,对后续求解答案没有帮助的对象 每个对象一旦弹出,可以结算其参与的答案,随后这