acwing
文章平均质量分 56
算法整理
introversi0n
人生走的每一步,都算数
展开
-
基础算法(一)——快速排序
快排是一种复杂度O(nlognnlog(n)nlogn)的排序算法,在极端情况下会退化为O(n2{n}^2n2),但是它是一种原地算法,即不需要占据额外空间原理是先在数列中取一个数x,这个数一般随机选取或是取中间值,然后将所有比x小的数移动到其一侧,大的数移动到其另一侧。然后将左右两堆数视为两个新的数列,再进行上述操作,直到递归结束。因此可以发现,快速排序的核心是先排序后递归。原创 2023-01-07 22:36:00 · 276 阅读 · 0 评论 -
基础算法(二)——归并排序
归并排序是一种复杂度O(nlognnlog(n)nlogn)的排序算法,并且在任何情况下都是,但是它不是原地算法,即需要额外存储空间其原理是,先将区间均匀分成左右两半,然后再对左右两半继续二分,直到一个数为一个区间为止。然后从小区间到大区间进行左右区间合并。合并方式就是将两个有序间合并为一个大区间,并且大区间保持有序,因为最小区间单元是一个数,因此最初的区间一定有序,由下至上就可以保证合并过程中的区间都是有序的。因此可以发现,归并排序的核心是先递归后排序。原创 2023-01-07 22:35:57 · 611 阅读 · 0 评论 -
基础算法(三)——二分查找
一种复杂度为OlognO(logn)Ologn级别的查找算法,需要被查找的数列具有某种单调性质,其本质其实是搜索一个符合check条件的区间。整数二分浮点数二分。原创 2023-01-11 23:10:52 · 519 阅读 · 0 评论 -
基础算法(四)——高精度
高精度算法是用于处理大整数运算的,大整数的大小一般是,其位数,标准数据即x原创 2023-03-30 16:13:59 · 72 阅读 · 0 评论 -
基础算法(六)——双指针算法
两个指针指向两个不同序列,用两个指针维护某一种逻辑,例如归并排序两个指针指向一个序列,即用两个指针维护一段区间,例如快排。原创 2023-01-05 22:14:02 · 370 阅读 · 0 评论 -
基础算法(七)——位运算
最常用的两种操作:求一个整数n二进制表示里的第k位(k从0开始)x=1010,则第0位为0,第1位为1,第2位为0,第3位为1求x的最后一位1,即lowbit(x)x=101000,那么。原创 2023-01-05 22:14:51 · 140 阅读 · 0 评论 -
基础算法(八)——离散化
这里的离散化,特指整数的、保序的离散化有些题目可能需要以数据作为下标来操作,但题目给出的数据的值比较大,但是数据个数比较小。此时就需要将数据映射到和数据个数数量级相同的区间,这就是离散化,即哈希映射。举个例子,数据值域范围是0~10e9数据个数范围是0~10e5,我们不可能开一个10e9的数组去存储,因此我们需要将数据映射到从0开始的自然数,即0~10e5,这样我们只需要开一个10e5的数组就可以去存储对应下标的一些值了。原创 2023-01-06 23:20:13 · 463 阅读 · 0 评论 -
基础算法(九)——区间合并
假定给出n个区间,将有交集的区间合并,最后求出合并后的区间个数。原创 2023-01-07 21:43:48 · 164 阅读 · 0 评论 -
数据结构(一)——链表
插入、删除非常快(需要知道需要插入和删除节点前一个位置)查询、访问(用索引)非常的慢链表的创建方法一般有如下几种:动态链表:结构体+指针(不适合做题用,容易因new Node();超时int val;Node *next;new Node();// 非常慢这种实现方式,每次创建新建节点,都需要调用一次new函数,但是这个新建过程非常慢,在笔试题中链表长度一般是1e5或者是1e6,new完这些节点基本上就直接超时了。静态链表:用两个数组表示val和next,用于模拟链表数组模拟单链表。原创 2023-01-09 00:37:45 · 218 阅读 · 0 评论