高精度计算模板的使用
高精度计算有几种常见的类型:
两个很大的整数相加A, B的位数均小于等于10⁶
两个很大的整数相减A, B的位数均小于等于10⁶
一个很大的整数乘以一个比较小的整数A的位数小于等于10⁶,B的数值小于等于10⁹
一个很大的整数除以一个比较小的整数A的位数小于等于10⁶,B的数值小于等于10⁹
还有 两个很大的整数相乘 和 两个很大的整数相除 这两种情况,不过不常用,暂时不学了。
我们写数字习惯从高位开始写,但是模拟加减乘除时由于要做进位的操作,所以从低位开始存比较方便。即:数组第 0 位存个位,第 1 位存十位,第 2 位存百位······
高精度加法C = A + B用变量 t 表示进位,要么是 1 要么是 0 。
123456789101112131415161718192021vector<int> add(vector<int> &A, vector<int> &B) { vector<int> C; // 和 int t = 0; // 1表示进位,0表示不进位 for ...
记录 Docker 设置新源记录解决 Error response from daemon
问题用 Docker 拉取 MySQL 的时候报错:
docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
解决方式:编写配置文件(2024/10/17 目前可用)将可用的镜像仓库地址写入 daemon.json 配置文件(没有就新建)
vim /etc/docker/daemon.json写入:
123456789101112131415161718192021222324{ "registry-mirrors": [ "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com", "htt ...
JVM 垃圾回收相关知识概要
如何判断对象是否死亡(两种方法)?
引用计数法
可达性分析算法
引用类型简介
强引用
软引用
弱引用
虚引用
垃圾回收算法
标记-清除算法
复制算法
标记-整理算法
分代收集算法
内存分配与回收原则
对象优先在 Eden 区分配 大多数情况下,对象会在新生代 Eden 区分配,当空间不足时触发 Minor GC。
空间分配担保 在 Minor GC 之前,检查老年代是否有足够空间存放新生代对象。
判断对象是否死亡
引用计数法 通过计数器判断引用状态,不适用解决循环引用问题。
可达性分析算法 从 GC Roots 开始,遍历引用链判断对象是否可达。
垃圾回收算法
标记-清除算法
标记不需要回收的对象,回收未标记对象。
存在效率低和内存碎片问题。
复制算法
将内存划分为两部分,每次使用一部分,回收后将存活对象复制到另一部分。
缺点是可用内存减少一半。
标记-整理算法
将存活对象移至一端,清理无用内存。
适用于老年代,效率较低。
分代收集算法
新生代采用复制算法,老年代采用标记-清除或标记-整理算法。
常见垃圾收集器
Seria ...
LC-155-最小栈
题意设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
思路代码12345678910111213141516171819202122232425class MinStack {public: stack<int> A, B; MinStack() {} void push(int val) { A.push(val); if (B.empty() || val <= B.top()) B.push(val); } void pop() { if (A.top() == B.top()) ...
Linux 常用命令整理
1. 目录结构/:所有文件和目录的根目录/usr/bin:存放系统的可执行文件,可以在任何目录下执行。/usr/local/bin:存放用户自己安装的可执行文件,可以在任何目录下执行。/etc: 存放系统的配置文件,如:/etc/profile 是环境变量的配置文件。/home: 每个用户的家目录,保存用户的私人数据,目录名默认和用户名相同。/opt: 存放用户额外安装的软件,类似 Windows 中的 Program Files 目录。
2. 常用命令文件 & 目录
查看和切换目录
1234567891011121314查看: pwd # 显示当前目录路径 ls # 列出当前目录下文件和目录 ls -l 或 ll # 列出当前目录下文件和目录(详细信息)切换目录: cd /opt # 切换到 /opt 目录 cd .. # 返回上一级目录 cd bin # 切换到当前目录的 ...
LC-617-合并二叉树
https://leetcode.cn/problems/merge-two-binary-trees/
题面给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
注意: 合并必须从两个树的根节点开始。
思路123456789TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) { if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2 if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1 // 修改了t1的数值和结构 t1->val += t2->val; // 中 t1->left = mergeTrees(t1->left, t2-&g ...
LC-106-从中序与后序遍历序列构造二叉树
https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
题面根据一棵树的中序遍历与后序遍历构造二叉树。
注意: 你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:
思路12345678910111213141516171819202122232425262728293031323334353637383940TreeNode* traversal(vector<int>& inorder, vector<int>& postorder) { if (postorder.size() == 0) return NULL; // 后序遍历数组最后一个元素,就是当前的中间节点 int rootValue = postorder[postord ...
LC-112-路径总和
题面https://leetcode.cn/problems/path-sum/
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例: 给定如下二叉树,以及目标和 sum = 22,
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
思路递归写法12345678910111213141516171819202122232425class Solution {private: bool traversal(TreeNode* cur, int count) { if (!cur->left && !cur->right && count == 0) return true; // 遇到叶子节点,并且计数为0 if (!cur->left && !cur->right) return fals ...
LC-110-平衡二叉树
https://leetcode.cn/problems/balanced-binary-tree/
题面给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
返回 false 。
代码(递归)12345678910111213// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了就返回-1int getHeight(TreeNode* node) { if (node == NULL) return 0; int leftHeight = getHeight(node->left); if (leftHeight == -1) return -1; int rightHeight = getHeight(node->right); if (rightHeigh ...
LC-111-二叉树的最小深度
https://leetcode.cn/problems/minimum-depth-of-binary-tree/
题面给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
返回它的最小深度 2。
思路这道题和求最大深度差别比较大的。
依然是前序后序遍历均可,前序求的是深度,后续求的是高度。
好好审题:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。注意,是叶子节点。
递归写法后序12345678910111213141516int getDepth(TreeNode* node) { if (node == NULL) return 0; int leftDepth = getDepth(node->left); // 左 int rightDepth = getDepth(node->right); // 右 ...