随笔分类 - 数据结构与算法
摘要:滑动窗口,简称滑窗,是快慢指针的一种应用技巧,两个指针之间形成一个窗口,右指针不断扩张,左指针按条件收缩,随着窗口的扩大和缩小找到满足条件的答案。
阅读全文
摘要:双指针是一种应用很广泛且基础的编程技巧,双指针中的“指针”是指索引、游标。 一、双指针思想 双指针是指在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针进行遍历,从而达到相应的目的。 最常见的双指针算法有两种: 在同一个序列中,用两个指针维护两个位置,或两个位置包含的区间; 在两个
阅读全文
摘要:差分是一种类似于前缀和的编码技巧,可以快速实现对数组某个区间的所有元素增加或减少一个值。
阅读全文
摘要:前缀和是指数组某个索引之前的所有元素的和,是一种重要的编码技巧,使用前缀和可以快速求出数组某一个区间的和。
阅读全文
摘要:枚举法,也称穷举法,是指在解决问题的时候穷举每一种可能的情况,最终得到符合要求的答案。枚举法的效率并不高,但适用于一些没有明显规律可循的场景。
阅读全文
摘要:递归是一种应用非常广泛的算法(或者变成技巧),很多算法的实现都需要依赖递归。简单来说,递归就是在函数中调用自己。递归求解问题分为“递”和“归”2 个过程。
阅读全文
摘要:一、算法原理 二、代码实现 三、算法评价 3.1 时间复杂度 3.2 空间复杂度 3.3 稳定性
阅读全文
摘要:一、算法原理 二、代码实现 三、算法评价 3.1 时间复杂度 3.2 空间复杂度 3.3 稳定性
阅读全文
摘要:一、算法原理 二、代码实现 三、算法评价 3.1 时间复杂度 3.2 空间复杂度 3.3 稳定性
阅读全文
摘要:快速排序的核心思想是:从待排序数组中任选一个数字作为 pivot(分区点),然后遍历所有数组元素,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间,此时,pivot 对应的数字排序完成;再将 pivot 左边和右边的数据,分别按照前面的方法进行排序。
阅读全文
摘要:归并排序的核心思想是:将待排序数组从中间分成两个子数组,对两个子数组分别排序,然后将排好序的两个子数组合并,这样整个数组就排序完成了。每次合并从两个子数组中逐个取最小值放入合并后数组,这样可以保证合并后的数组有序。
阅读全文
摘要:排序算法 时间复杂度 空间复杂度 稳定性 算法核心 插入排序 O(n2) O(1) 稳定 插入排序 一、算法原理 插入排序将数组分为已排序区间和未排序区间,初始已排序区间只有数组第1个元素,未排序区间从下标 1 开始到数组末尾。每次取未排序区间的第1个元素,将它插入已排序区间的合适位置,并保证已排序
阅读全文
摘要:排序算法 时间复杂度 空间复杂度 稳定性 算法核心 选择排序 O(n2) O(1) 不稳定 比较交换 一、算法原理 选择排序将数组分为已排序区间和未排序区间,初始已排序区间无元素,未排序区间从下标 0 开始到数组末尾。每次选择未排序区间的最小元素,将它放到已排序区间末尾。一次选择会让一个元素移动到它
阅读全文
摘要:排序算法 时间复杂度 空间复杂度 稳定性 算法核心 冒泡排序 O(n2) O(1) 稳定 比较交换 一、算法原理 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,如果不满足大小关系要求,就进行交换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个
阅读全文
摘要:排序是对批量数据按照一定的顺序进行排列的操作。学习排序算法,就是学习每一种算法的算法原理、代码实现,以及如何评价算法优劣。
阅读全文
摘要:一、先进先出(FIFO) 队列是一种操作受限的线性表,只允许在队头进行删除操作,在队尾进行添加操作。向队尾添加元素叫做入队,从队头删除元素叫做出队。 适用场景:对于大部分资源有限的场景,当没有空闲资源时,基本上都可以通过队列来实现请求排队。比如,线程池、连接池、消息队列等。 二、队列的实现 队列可以
阅读全文
摘要:一、后进先出(LIFO) 栈是一种操作受限的线性表,只允许在一端插入和删除数据,这一端叫做栈顶,对应的另一端叫做栈底。向栈中添加元素也叫进栈、入栈、压栈,从栈中删除元素也叫出栈、退栈、弹栈。 适用场景:当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,就应该首选栈。 二、栈
阅读全文
摘要:
链表通过指针将一组零散的内存串联在一起,也是一种非常基础、非常常用的数据结构。 一、常见的3种链表 从内存的角度来看,数组需要一块连续的内存空间,对内存的要求比较高。但是,链表并不需要连续的内存空间,而是通过“指针”将一组零散的内存串联起来。 如果我们申请一个 100M 大小的数组,当内存中没有连续
阅读全文
链表通过指针将一组零散的内存串联在一起,也是一种非常基础、非常常用的数据结构。 一、常见的3种链表 从内存的角度来看,数组需要一块连续的内存空间,对内存的要求比较高。但是,链表并不需要连续的内存空间,而是通过“指针”将一组零散的内存串联起来。 如果我们申请一个 100M 大小的数组,当内存中没有连续
阅读全文
摘要:编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是编程语言中的一种数据类型,还是一种最基础的数据结构。 一、数组支持随机访问 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组类型相同的数据。 1.1 线性表 线性表就是数据排成一条线一样的结构。每个线性表上的数据最多只
阅读全文

浙公网安备 33010602011771号