
算法模板
文章平均质量分 71
总结基础算法的模板
諒口叁叁
一位尚在努力的普通人
展开
-
【总结】背包问题的至多/恰好/至少
对于一维背包问题,注意区分该问题的下面这三种情况,即至多/恰好/至少,它们的状态转移方程其实是一样的,差异在于初始化。 (1) 体积至多是v时的最小/大值 全部初始化为0,且保证v大于等于0。 代表题目:AcWing 423.采药,其代码如下: import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in);原创 2021-04-26 23:24:48 · 494 阅读 · 0 评论 -
整数二分查找
下面分享常用的二分查找模板。面对具体算法题时,分析出check()函数该如何写后,根据左边界l应该写为l = mid + 1还是l = mid来选择使用哪一个模板,一般来说就无需额外考虑边界的问题了。 模板1 boolean check(int x){/* ... */} // 检查x是否满足某种性质 int binary_search(int l, int r){ while(l < r){ int mid = l + r >> 1; // 注意可能溢出,最好写成((原创 2021-04-08 11:51:56 · 166 阅读 · 0 评论 -
双指针/滑动窗口
本文主要内容转载于分享珍藏的滑动窗口模板,学会套路秒杀十题 双指针算法,或滑动窗口算法,在《挑战程序设计竞赛》这本书中被叫做「虫取法」,我觉得非常生动形象。因为滑动窗口的两个指针移动的过程和虫子爬动的过程非常像:前脚不动,把后脚移动过来;后脚不动,把前脚向前移动。 下面分享一个代码模板,能解决大多数滑动窗口问题: public int findSubArray(nums){ int n = nums.length; // 数组的长度,如果是字符串,改成nums.length() int left =原创 2021-02-05 11:21:50 · 325 阅读 · 0 评论 -
哈希表
哈希表 哈希表的关键是哈希函数,以及如何处理冲突。常见的处理冲突的方法有拉链法和开放寻址法。 1)拉链法 使用数组实现的哈希表如图所示,数组中每个槽对应一条单链表。插入操作的基本原理是:根据哈希函数给出的哈希值,判断数组中该位置是否被占用,如果没有,则插入到此位置,如果被占用,则插入到单链表的头部(头插法)。查询操作的基本原理是:根据哈希函数给出的哈希值,如果数组中该位置没被占用,则代表查询的值不存在,如果该位置被占用,则在位置对应的单链表中顺序查找。 算法题中,哈希表一般只有插入和查找操作。如果要实现删原创 2021-02-02 17:15:26 · 244 阅读 · 0 评论 -
并查集
目录定义实现思路代码模板 定义 并查集是一种树形的数据结构,主要支持这两个操作:1)询问两个元素是否属于同一个子集,即find操作;2)将两个元素所属的子集合并,即union操作。 并查集可以在近乎O(1)O(1)O(1)的时间复杂度里完成上述两个操作。 实现思路 在并查集中,每个子集用一棵树来表示,树的根节点编号就是子集的编号。通常使用一维数组ppp来进行存储,p[x]p[x]p[x]表示节点xxx的父节点。 1)如何判断是否为根节点? 根节点的父节点为自身,因此,判断p[x] == x的真假即可判断是否原创 2021-02-01 20:11:52 · 153 阅读 · 0 评论 -
堆以及堆排序
堆 堆是一棵完全二叉树。 小根堆:每个父节点的值,都小于等于其子节点的值。因此,根节点的值为集合的最小值。 大根堆:每个父节点的值,都大于等于其子节点的值。因此,根节点的值为集合的最大值。 使用一维数组来存储堆。根节点的值存放在数组中索引值为1的位置。由于完全二叉树的特性,若父节点在数组的索引为xxx,则其左子节点的索引为2x2x2x,右子节点的索引为2x+12x+12x+1。(凡是完全二叉树,都是用一维数组来存储的) 堆最核心的是up操作和down操作,使用这两个操作可完成以下堆(小根堆)主要支持的函数原创 2021-01-30 17:27:25 · 131 阅读 · 1 评论