随笔分类 - 数据结构与算法
摘要:单调队列 思想 以寻找滑动窗口中的最小值为例 维护一个最小值的队列,队头为最小值, 将最新的数组元素加入队尾时, 将队列中比最新的数组元素小的元素从尾部出队, 这样我们就维护了一个有关最小值的单调递增队列 代码模板 //常见模型:找出滑动窗口中的最大值/最小值 int hh = 0, tt = -1
阅读全文
摘要:单调栈 思想 假设要找数组中每个数左边最近的比他小的数,如:1 3 2 4 将每一个比当前要小的数存入栈中; 1没有 3是1,当遍历到2时,我们已经将13存入栈中,此时弹出3,1就是我们要找的数,之后把2再加入到栈中 为什么要弹出3,因为2比3要小,后面的数往前遍历只需要遍历到2就结束了 常用来解决
阅读全文
摘要:区间和并 // 将所有存在交集的区间合并 void merge(vector<PII> &segs) { vector<PII> res; //按照先左边,后右边进行排序 sort(segs.begin(), segs.end()); int st = -2e9, ed = -2e9;//负无穷 f
阅读全文
摘要:离散化 思想 将范围特别大的数组并且数组中数据比较少的映射到比较小的数组当中去。 如:将1、3、2000、500000 映射到1、2、3、4中去。 方法:先将所有的角标存下来,然后将角标排序去重。 查找对应离散化后的角标时使用二分来进行查找。 公式 vector<int> alls; // 存储所有
阅读全文
摘要:位运算 求n的第k位数字 1010(数) 3210(位) 公式 n >> k & 1 返回n的最后一位 x=1010,返回10 公式 lowbit(n) = n & -n
阅读全文
摘要:判断一个数是否为2的幂 思想 例1、 4的补码为: 00000100 3的补码为: 00000011 4 & 3 = 0 因此 n & n 1 == 0,此数即为2的幂(n 0) 例2、 4的补码为: 00000100 4的补码为: 11111100 4 & 4 = 4 因此 n & n == n,
阅读全文
摘要:高精度加减乘除(C++) 高精度加法 使用数组存储,高位在高角标,低位在低角标,相加向高位进位 高精度乘低精度 使用数组存储,高位在高角标,低位在低角标,相乘整个B向高位进位
阅读全文
摘要:二分查找 1、整数二分 ~~~~ bool check(int x) { / ... / } //检查x是否满足某种性质 //适用于区间[l,r]被划分成[l,mid],[mid+1,r]时使用,也就是ture分在左半边 int bsearch_1(int l, int r) { while (l
阅读全文
摘要:归并排序 ~~~~ const int N = 1e6 + 10; int q[N], tmp[N]; void merge_sort(int q[], int l, int r) { if (l = r)return; int mid = l + r 1; merge_sort(q, l, mid
阅读全文
摘要:快速排序 ~~~~ void quick_sort(int q[], int l, int r) { if (l = r)return; int i = l 1, j = r + 1, x = q[l + r 1]; while (i x); if (i < j) swap(q[i], q[j]);
阅读全文