09 2024 档案
摘要:模板 for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑 } 常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两
阅读全文
摘要:高精度 +-*/ 高精加模板 // C = A + B, A >= 0, B >= 0 vector <int> add(vector <int> &A, vector <int> &B) { if (A.size() < B.size()) return add(B, A); vector<int
阅读全文
摘要:map #include <bits/stdc++.h> //map的基本操作如下 using namespace std; int main() { // 构造函数 map <string,int> dict; // 下标类型 存储的值的类型 // 插入数据的三种方式 dict.insert(pa
阅读全文
摘要:lower_bound( ) & upper_bound( ) 1.对于一个从小到大排序的数组 lower_bound(begin,end,x) upper_bound(begin,end,x) 前者查找成功返回的是从地址begin到end-1中第一个大于或者等于x的地址,后者查找成功返回的是从地址
阅读全文
摘要:二分 定义 二分查找(binary search),也称折半搜索(half-interval search)、对数搜索(logarithmic search),是用来在一个有序数组中查找某一元素的算法。 过程 以在一个升序数组中查找一个数为例。 它每次考察数组当前部分的中间元素,如果中间元素刚好是要
阅读全文
摘要:前缀和 一维前缀和 s[i] = a[1] + a[2] + ... a[i] a[l] + ... + a[r] = s[r] - s[l - 1] 二维前缀和 s[i, j] = 第i行j列格子左上部分所有元素的和 以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为: s[x2,
阅读全文
摘要:快速排序 定义 快速排序(Quicksort),又称分区交换排序(partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。 过程 快速排序的工作原理是通过 分治 的方式来将一个数组排序。 快速排序分为三个过程: 1.将数列划分为两部分(要求保证相对大小关系); 2
阅读全文
摘要:归并排序 . . . . . . 定义 归并排序(merge sort)是高效的基于比较的稳定排序算法。 性质 归并排序基于分治思想将数组分段排序后合并,时间复杂度在最优、最坏与平均情况下均为 O(n log n),空间复杂度为 O(n)。 归并排序可以只使用 O(1) 的辅助空间,但为便捷通常使用
阅读全文
摘要:插入排序 . . . . . . 定义 插入排序(Insertion sort)是一种简单直观的排序算法。它的工作原理为将待排列元素划分为「已排序」和「未排序」两部分,每次从「未排序的」元素中选择一个插入到「已排序的」元素中的正确位置。 稳定性 插入排序是一种稳定的排序算法。 时间复杂度 插入排序的
阅读全文
摘要:冒泡排序 . . . . . . 定义 冒泡排序(Bubble sort)是一种简单的排序算法。由于在算法的执行过程中,较小的元素像是气泡般慢慢「浮」到数列的顶端,故叫做冒泡排序。 过程 它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。当没有相
阅读全文
摘要:选择排序 . . . . . . 定义 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每次找出第 i 小的元素(也就是 A{i..n} 中最小的元素),然后将这个元素与数组第 i 个位置上的元素交换。 稳定性 由于 swap(交换两个元素)操作的存在,选择排序是一种
阅读全文