随笔分类 -  AcWing

摘要:整数哈希: 一般可以用取模的方式,模的数(数组长度)最好取质数且离2的幂尽可能远 哈希冲突可以用拉链法和开放寻址法解决 拉链法可以用链表进行模拟,插入时在哈希寻址处的链表头结点插入 开放寻址法则直接向后找(经验值,数据长度一般要开到题目数据范围的2-3倍),利用find函数找到数据的位置或应该插入的 阅读全文
posted @ 2021-12-23 10:43 80k 阅读(66) 评论(0) 推荐(0) 编辑
摘要:堆可以用二叉树存储。 当前节点比左右子节点的值都小或等于(小根堆)。 对于完全二叉树,根节点编号为1,则,对于编号为n的节点,左子节点编号为2n,右子节点标号为2n+1。 完全二叉树可以用一维数组存储(编号→下标) 基本操作:up和down up:当节点数值比父节点小时,交换当前节点与父节点的值,然 阅读全文
posted @ 2021-12-19 20:42 80k 阅读(58) 评论(0) 推荐(0) 编辑
摘要:并查集支持操作: 1、将两个集合合并 2、询问两个元素是否在一个集合当中 每个集合用一棵树来表示,以根节点编号表示整个集合,每个节点存储父节点p[x] 判断树根 if(p[x]==x) 求集合编号 while(p[x]!=x) x=p[x]; 合并集合:x和y,x→根节点x,p[x]=y。 优化:路 阅读全文
posted @ 2021-12-19 19:16 80k 阅读(152) 评论(0) 推荐(0) 编辑
摘要:Trie树可以用来存储前缀字符串/数组。 可以用数组进行模拟 son[N][26] 记录节点的son cnt[N] 记录以当前节点为最后字符的字符串出现的次数 idx当前用到的节点 例题 143. 最大异或对 #include<iostream> using namespace std; const 阅读全文
posted @ 2021-12-19 18:51 80k 阅读(67) 评论(0) 推荐(0) 编辑
摘要:KMP用于o(n)的字符串匹配。 使用next数组记录以当前阶段为后缀的,和以开始位置为前缀匹配的最长长度,即匹配过程中进行后移后保留的长度。 next数组的计算和匹配过程类似。 推荐数组从1开始计数 注意,自身match时,是不包含当前位置的前缀,而互相match时,是包含当前位置的前缀,所以两次 阅读全文
posted @ 2021-12-12 15:40 80k 阅读(109) 评论(0) 推荐(0) 编辑
摘要:可以用数组直观的模拟栈和队列,栈记录栈顶位置,队列记录头和尾。 单调栈和单调队列可以用来记录有单调性的数据,当插入新数据时,将违反单调性的数据删去,保持单调。 可以查找,距离最近的小于当前数据的位置,以及滑动窗口内的极值。 阅读全文
posted @ 2021-12-12 14:29 80k 阅读(35) 评论(0) 推荐(0) 编辑
摘要:链表一般不用结构体创建(new的使用很慢) 而是用邻接表进行表示 两个数组分别e[]和ne[]分别记录节点的值和下一个节点的编号 head记录头结点指向的位置,idx表示当前可以使用的节点 用数组模拟链表时,删除链表无法释放内存,但是运行速度快。 双链表则用e[]和l[]和r[]记录; 可以将单链表 阅读全文
posted @ 2021-12-12 10:50 80k 阅读(57) 评论(0) 推荐(0) 编辑
摘要:用于数据范围大但稀疏的数据 unique可以用来去重; unique(v.begin(),v.end()); 返回值指向最后一个无重复元素的下一位; 可以用 v.erase(unique(v.begin(),v.end()),v.end())去除有序数组中的重复元素。 对有序无重复数组,查找可以使用 阅读全文
posted @ 2021-12-11 10:50 80k 阅读(66) 评论(0) 推荐(0) 编辑
摘要:x&(-x)可以取得x的最后一位1. x&(x-1)可以去掉x的最后一位1. 阅读全文
posted @ 2021-12-11 10:44 80k 阅读(33) 评论(0) 推荐(0) 编辑
摘要:前缀和可以快速求部分和有一维和二维的实现。数组的下标最好从1开始前缀和下标从0开始,以统一求a1~ai时的接口 差分主要用于对某个区间同时进行加减前缀和的逆运算可以用o(n)的时间恢复原数组d[i]=a[i]-a[i-1];AcWing 797. 差分#include<iostream> using 阅读全文
posted @ 2021-12-09 10:47 80k 阅读(59) 评论(0) 推荐(0) 编辑
摘要:大整数用数组表示第一位写在index=0的位置,因为运算可能进位。vector<int> 自带size(),方便表示大整数;输出的时候要反向 高精度加法要记得最后加上carryvector<int> add(vector<int> &A, vector<int> &B){ if (A.size() 阅读全文
posted @ 2021-12-08 20:28 80k 阅读(56) 评论(0) 推荐(0) 编辑
摘要:求数组的逆序对可以用归并排序的思想。在归并的过程中,求出当前范围的逆序对数。只需在归并排序的代码中多加一行 void MergeSortAndReversePairs(vector<int> &nums,int l,int r) { if(l>=r) return; int mid=(l+r)>>1 阅读全文
posted @ 2021-12-08 20:20 80k 阅读(23) 评论(0) 推荐(0) 编辑
摘要:查找数组中第k个数,可以利用基于快速排序思想的快速选择算法。注意事项同快排完全相同一样int QuickFindK(int nums[],int l,int r,int k){ if(l==r&&l==k) return nums[k]; int left=l-1,right=r+1; int ke 阅读全文
posted @ 2021-12-08 20:17 80k 阅读(29) 评论(0) 推荐(0) 编辑
摘要:二分查找的本质是寻找一个性质,使数组的左侧全不满足,右侧全满足(或左侧全满足,右侧全不满足)。查找的结果是最后一个或第一个满足的点(左侧区间最右或右侧区间最左)根据两种情况,有不同的check()、mid、l、r写法 查左侧区间最右 mid=(l+r+1)>>1; if(check(mid)) l= 阅读全文
posted @ 2021-12-08 20:15 80k 阅读(58) 评论(0) 推荐(0) 编辑
摘要:不使用数学方法,有明显的两段性适用于二分查找。同时第i行有几个数小于mid可以直接计算,[mid/i」个 阅读全文
posted @ 2021-12-08 20:12 80k 阅读(14) 评论(0) 推荐(0) 编辑
摘要:可以转化为二维背包问题。负无穷可以用memset和-0x3f初始化 阅读全文
posted @ 2021-12-08 20:12 80k 阅读(29) 评论(0) 推荐(0) 编辑
摘要:归并排序模板 int tmp[100010];void MergeSort(vector<int> &nums,int l,int r){ if(l>=r) return; int mid=(l+r)/2; MergeSort(nums,l,mid);//使用mid和mid+1防止死循环 Merge 阅读全文
posted @ 2021-12-08 20:07 80k 阅读(28) 评论(0) 推荐(0) 编辑
摘要:模板以及说明如下 void QuickSort(vector<int> &nums,int l,int r){ if(l>=r) return; int key=nums[r];//r或l int left=l-1,right=r+1; while(left<right) { while(nums[ 阅读全文
posted @ 2021-12-08 20:04 80k 阅读(23) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示