程序与技术分享:Acwing算法笔记

简介: 程序与技术分享:Acwing算法笔记

1.基础算法 —— 代码模板链接 常用代码模板1——基础算法


排序


二分


高精度


前缀和与差分


双指//代码效果参考:http://www.jhylw.com.cn/442920807.html

针算法

位运算


离散化


区间合并


2.数据结构 —— 代码模板链接 常用代码模板2——数据结构


链表与邻接表:树与图的存储


栈与队列:单调队列、单调栈


kmp


Trie


并查集



Hash表


C++ STL使用技巧


3.搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论


DFS与BFS


树与图的遍历:拓扑排序


最短路


最小生成树


二分图:染色法、匈牙利算法


4.数学知识 —— 代码模板链接 常用代码模板4——数学知识


质数


约数


欧拉函数


快速幂


扩展欧几里得算法


中国剩余定理


高斯消元


组合计数


容斥原理


简单博弈论


5.动态规划


背包问题


线性DP


区间DP


计数类DP


数位统计DP


状态压缩DP


树形DP


记忆化搜索


1.常用代码模板1——基础算法


快速排序算//代码效果参考:http://www.jhylw.com.cn/364637537.html

法模板 —— 模板题 AcWing 785. 快速排序

void quick_sort(int q【】, int l, int r)


{undefined


if (l >= r) return;


int i = l - 1, j = r + 1, x = q【l + r ] 1】;


while (i [span style="color: rgba(0, 0, 0, 1)"> j)


{undefined


do i ++ ; while (q【i】 [span style="color: rgba(0, 0, 0, 1)"> x);


do j -- ; while (q【j】 > x);


if (i [span style="color: rgba(0, 0, 0, 1)"> j) swap(q【i】, q【j】);


}


quick_sort(q, l, j), quick_sort(q, j + 1, r);


}


归并排序算法模板 —— 模板题 AcWing 787. 归并排序


void merge_sort(int q【】, int l, int r)


{undefined


if (l >= r) return;


int mid = l + r ] 1;


merge_sort(q, l, mid);


merge_sort(q, mid + 1, r);


int k = 0, i = l, j = mid + 1;


while (i <= mid && j <= r)


if (q【i】 < q【j】) tmp【k ++ 】 = q【i ++ 】;


else tmp【k ++ 】 = q【j ++ 】;


while (i <= mid) tmp【k ++ 】 = q【i ++ 】;


while (j <= r) tmp【k ++ 】 = q【j ++ 】;


for (i = l, j = 0; i <= r; i ++, j ++ ) q【i】 = tmp【j】;


}


整数二分算法模板 —— 模板题 AcWing 789. 数的范围


bool check(int x) {/ ... /} // 检查x是否满足某种性质


// 区间【l, r】被划分成【l, mid】和【mid + 1, r】时使用:


int bsearch_1(int l, int r)


{undefined


while (l [span style="color: rgba(0, 0, 0, 1)"> r)


{undefined


int mid = l + r ] 1;


if (check(mid)) r = mid; // check()判断mid是否满足性质


else l = mid + 1;


}


return l;


}


// 区间【l, r】被划分成【l, mid - 1】和【mid, r】时使用:


int bsearch_2(int l, int r)


{undefined


while (l [span style="color: rgba(0, 0, 0, 1)"> r)


{undefined


int mid = l + r + 1 ] 1;


if (check(mid)) l = mid;


else r = mid - 1;


}


return l;


}


浮点数二分算法模板 —— 模板题 AcWing 790. 数的三次方根


bool check(double x) {/ ... /} // 检查x是否满足某种性质


double bsearch_3(double l, double r)


{undefined


const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求


while (r - l > eps)


{undefined


double mid = (l + r) / 2;


if (check(mid)) r = mid;


else l = mid;


}


return l;


}


高精度加法 —— 模板题 AcWing 791. 高精度加法


// C = A + B, A >= 0, B >= 0


vector[span style="color: rgba(0, 0, 255, 1)">intintint

{undefined


if (A.size() < B.size()) return add(B, A);


vector[span style="color: rgba(0, 0, 255, 1)">int

int t = 0;


for (int i = 0; i < A.size(); i ++ )


{undefined


t += A【i】;


if (i < B.size()) t += B【i】;


C.push_back(t % 10);


t /= 10;


}


if (t) C.push_back(t);


return C;


}


高精度减法 —— 模板题 AcWing 792. 高精度减法


// C = A - B, 满足A >= B, A >= 0, B >= 0


vector[span style="color: rgba(0, 0, 255, 1)">intintint

{undefined


vector[span style="color: rgba(0, 0, 255, 1)">int

for (int i = 0, t = 0; i < A.size(); i ++ )


{undefined


t = A【i】 - t;


if (i < B.size()) t -= B【i】;


C.push_back((t + 10) % 10);


if (t < 0) t = 1;


else t = 0;


}


while (C.size() > 1 && C.back() == 0) C.pop_back();


return C;


}


高精度乘低精度 —— 模板题 AcWing 793. 高精度乘法


// C = A b, A >= 0, b > 0


vector[span style="color: rgba(0, 0, 255, 1)">intint

{undefined


vector[span style="color: rgba(0, 0, 255, 1)">int

int t = 0;


for (int i = 0; i < A.size() || t; i ++ )


{undefined


if (i < A.size()) t += A【i】 b;


C.push_back(t % 10);


t /= 10;


}


while (C.size() > 1 && C.back() == 0) C.pop_back();


return C;


}


高精度除以低精度 —— 模板题 AcWing 794. 高精度除法


// A / b = C ... r, A >= 0, b > 0


vector[span style="color: rgba(0, 0, 255, 1)">intint

{undefined


vector[span style="color: rgba(0, 0, 255, 1)">int

r = 0;


for (int i = A.size() - 1; i >= 0; i -- )


{undefined


r = r * 10 + A【i】;


C.push_back(r / b);


r %= b;


}


reverse(C.begin(), C.end());


while (C.size() > 1 && C.back() == 0) C.pop_back();


return C;


}


一维前缀和 —— 模板题 AcWing 795. 前缀和


S【i】 = a【1】 + a【2】 + ... a【i】


a【l】 + ... + a【r】 = S【r】 - S【l - 1】


二维前缀和 —— 模板题 AcWing 796. 子矩阵的和


S【i, j】 = 第i行j列格子左上部分所有元素的和


以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:


S【x2, y2】 - S【x1 - 1, y2】 - S【x2, y1 - 1】 + S【x1 - 1, y1 - 1】


一维差分 —— 模板题 AcWing 797. 差分


给区间【l, r】中的每个数加上c:B【l】 += c, B【r + 1】 -= c


二维差分 —— 模板题 AcWing 798. 差分矩阵


给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:


S【x1, y1】 += c, S【x2 + 1, y1】 -= c, S【x1, y2 + 1】 -= c, S【x2 + 1, y2 + 1】 += c


位运算 —— 模板题 AcWing 801. 二进制中1的个数


求n的第k位数字: n ] k & 1


返回n的最后一位1:lowbit(n) = n & -n


双指针算法 —— 模板题 AcWIng 799. 最长连续不重复子序列, AcWing 800. 数组元素的目标和


for (int i = 0, j = 0; i < n; i ++ )


{undefined


while (j < i && check(i, j)) j ++ ;


// 具体问题的逻辑


}


常见问题分类:


(1) 对于一个序列,用两个指针维护一段区间


(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作


离散化 —— 模板题 AcWing 802. 区间和


vector[span style="color: rgba(0, 0, 255, 1)">int

sort(alls.begin(), alls.end()); // 将所有值排序


alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素


二分求出x对应的离散化的值


int find(int x) // 找到第一个大于等于x的位置


{undefined


int l = 0, r = alls.size() - 1;


while (l [span style="color: rgba(0, 0, 0, 1)"> r)


{undefined


int mid = l + r ] 1;


if (alls【mid】 >= x) r = mid;


else l = mid + 1;


}


return r + 1; // 映射到1, 2, ...n


}


区间合并 —— 模板题 AcWing 803. 区间合并


// 将所有存在交集的区间合并


void merge(vector


&segs)


{undefined


vector


res;


sort(segs.begin(), segs.end());


int st = -2e9, ed = -2e9;


for (auto seg : segs)


if (ed [span style="color: rgba(0, 0, 0, 1)"> seg.first)


{undefined


if (st != -2e9) res.push_back({st, ed});


st = seg.first, ed = seg.second;


}


else ed = max(ed, seg.second);


if (st != -2e9) res.push_back({st, ed});


segs = res;


}


2.常用代码模板2——数据结构


单链表 —— 模板题 AcWing 826. 单链表


// head存储链表头,e【】存储节点的值,ne【】存储节点的next指针,idx表示当前用到了哪个节点


int head, e【N】, ne【N】, idx;


// 初始化


void init()


{undefined


head = -1;


idx = 0;


}


// 在链表头插入一个数a


void insert(int a)


{undefined


e【idx】 = a, ne【idx】 = head, head = idx ++ ;


}


// 将头结点删除,需要保证头结点存在


void remove()


{undefined


head = ne【head】;


}


双链表 —— 模板题 AcWing 827. 双链表


// e【】表示节点的值,l【】表示节点的左指针,r【】表示节点的右指针,idx表示当前用到了哪个节点


int e【N】, l【N】, r【N】, idx;


// 初始化


void init()


{undefined


//0是左端点,1是右端点


r【0】 = 1, l【1】 = 0;


idx = 2;


}


// 在节点a的右边插入一个数x


void insert(int a, int x)


{undefined


e【idx】 = x;


l【idx】 = a, r【idx】 = r【a】;


l【r【a】】 = idx, r【a】 = idx ++ ;


}


// 删除节点a


void remove(int a)


{undefined


l【r【a】】 = l【a】;


r【l【a】】 = r【a】;


}


栈 —— 模板题 AcWing 828. 模拟栈


// tt表示栈顶


int stk【N】, tt = 0;


// 向栈顶插入一个数


stk【 ++ tt】 = x;


// 从栈顶弹出一个数


tt -- ;


// 栈顶的值


stk【tt】;


// 判断栈是否为空


if (tt > 0)


{undefined


}


队列 —— 模板题 AcWing 829. 模拟队列


1. 普通队列:


// hh 表示队头,tt表示队尾


int q【N】, hh = 0, tt = -1;


// 向队尾插入一个数


q【 ++ tt】 = x;


// 从队头弹出一个数


hh ++ ;


// 队头的值


q【hh】;


// 判断队列是否为空


if (hh <= tt)


{undefined


}


2. 循环队列


// hh 表示队头,tt表示队尾的后一个位置


int q【N】, hh = 0, tt = 0;


// 向队尾插入一个数


q【tt ++ 】 = x;


if (tt == N) tt = 0;


// 从队头弹出一个数


hh ++ ;


if (hh == N) hh = 0;


// 队头的值


q【hh】;


// 判断队列是否为空


if (hh != tt)


{undefined


}


单调栈 —— 模板题 AcWing 830. 单调栈


常见模型:找出每个数左边离它最近的比它大/小的数


相关文章
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
2月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
50 3
|
3月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
3月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
3月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
92 1
|
3月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
82 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
缓存 分布式计算 监控
算法优化:提升程序性能的艺术
【10月更文挑战第20天】算法优化:提升程序性能的艺术
|
3月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
25 0
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
36 0

热门文章

最新文章