海上月是天上月,眼前人是心上人。
09 2024 档案
摘要:归并排序 归并排序(merge sort)是一种基于分治策略的排序算法,包含下图所示的“划分”和“合并”阶段。 划分阶段:通过递归不断地将数组从中点处分开,将长数组的排序问题转换为短数组的排序问题。 合并阶段:当子数组长度为1时终止划分,开始合并,持续地讲左右两个较短的有序数组合并为一个较长的有序数
阅读全文
摘要:快速排序 快速排序(quick sort)是一种基于分治策略的排序算法,运行高效,应用广泛。 快速排序的核心操作是“哨兵划分”,其目标是::选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体流程如下: 选取数组最左端元素作为基准数,初始化两个指针
阅读全文
摘要:简单排序算法 时间复杂度均为O(n2) 选择排序 选择排序(selection sort)的工作原理非常简单:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序的区间的末尾。 算法流程 设数组长度为n,选择排序的算法流程如下。 初识状态下,所有元素未排序,即未排序(索引)区间为[1, n-
阅读全文
摘要:DLL介绍 DLL(动态链接库,Dynamic Link Library)是一种可执行文件,它包含可以在其他程序中调用的函数和数据。他是Windows操作系统中的一个重要概念,用于代码共享和模块化。 特点 代码共享:多个程序可以同时使用同一个DLL文件,而不需要将其代码编译到每个程序中。这样可以节省
阅读全文
摘要:哈希优化策略 在算法题中,我们通常通过线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给定一个整数数组nums和一个目标元素target,请在数组中搜索“和”为target的两个元素,并返回他们的数组索引。返回任意一个即可。 线性查找: 以时间换空间
阅读全文
摘要:二分查找插入点 二分查找不仅可用于搜索目标元素,还可以解决许多变种问题,比如搜索目标元素的插入位置。 无重复元素情况 Question 给定一个长度为n的有序数组nums和一个元素target,数组不存在重复元素。现将target插入数组nums中,并保持其有序性。若数组中已存在元素target,则
阅读全文
摘要:二分查找 二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。 Qustion: 给定一个长度为n的数组nums,元素按从小到大的顺序排列且不重复。请查找并返回元素target在该数组中的索引。若数组不
阅读全文
摘要:图的实现 基于邻接矩阵的实现 给定一个顶点数量为n的无向图: 初始化:传入n个顶点,初始化长度为n的顶点列表vertices,使用O(n)时间;初始化 n * n 大小的邻接矩阵adjMat,使用O(n2)时间。 添加或删除边:直接在邻接矩阵中修改指定的边即可,使用O(1)时间。而由于是无向图,因此
阅读全文
摘要:图 图(graph)是一种非线性数据结构,由顶点(vertex)和边(edge)组成。我们可以将图G抽象地表示为一组顶点V和一组边E的集合。以下示例展示了一个包含5个顶点和7条边的图。 如果将顶点看做节点,将边看做连接各个节点的引用(指针),我们就可以将图看作一种从链表拓展而来的数据结构。如下图,相
阅读全文
摘要:堆 堆(heap)是一种满足特定条件的完全二叉树,主要分为两种类型: 小顶堆(min heap):任意节点的值 ≤ 其子节点的值 大顶堆(max heap):任意节点的值 ≥ 其子节点的值 堆作为完全二叉树的一个特例,具有以下特性: 最底层节点靠左填充,其他层的节点都被填满 我们将二叉树的根节点称为
阅读全文
摘要:map/multimap容器 Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一个元素被视为键值,第二个元素被视为实值,map不允许两个元素有相同的键值。 multimap和map的操作类似,唯一区别是multimap的键值可以重复。
阅读全文
摘要:set/multiset容器 简介 Set的特性是,所有元素都会根据元素的值自动被排序。Set不允许两个元素有相同的值。 Set的迭代器iterator是一种const_iterator,不能通过迭代器改变任意set元素的值。 multiset的特性和用法和set相同,唯一的差别在于它允许值重复。
阅读全文
摘要:queue容器 基本概念 queue是一种**先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。 queue容器没有迭代器,所有元素进出都必须符合“先进先出”条件,只有顶端的元素才有机会被外界取用,所以也不提供遍历功能。 queue容器常用操作 构造函数 queu
阅读全文
摘要:stack容器 基本概念 stack是一种先进后出的数据结构,它只有一个出口,形式如下图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何地方可以存取stack的娶她元素。换句话说,stack不允许有遍历行为。 元素推入栈的操作称为push,将元素推出栈的操作称为p
阅读全文
摘要:模板 模板介绍 C++提供了函数模板(function template)。所谓函数模板。实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡事函数体相同的函数都可以使用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时
阅读全文
摘要:AVL树 在“二叉搜索树”章节提到,在多次插入和删除操作后,二叉搜索树可能退化为链表。在这种情况下,所有操作的时间复杂度将从O(logn)劣化为O(n)。 如下图,经过两次删除节点操作,这棵二叉搜索树便会退化为链表 再例如,下图所示的完美二叉树中插入两个节点后,树将严重向左倾斜,查找操作的时间复杂度
阅读全文
摘要:explicit关键字 在C++中,explicit关键字用于控制某些类型转换的隐式性。它主要与构造函数和转换操作符相关联,下面详细介绍explicit关键字的使用和作用。 explicit构造函数 当构造函数被声明为explicit时,它指示的这个构造函数只能使用显式构造对象,不能用于隐式类型转换
阅读全文
摘要:列表初始化 在C++11及以后的版本中,使用{}来初始化变量是一种新的初始化方法,称为列表初始化(List Initialization)。这种初始化方法可以用来初始化内置类型、自定义类型以及聚合类型。 示例代码: /*AVL 树节点类*/ struct TreeNode{ int val{}; i
阅读全文
摘要:二叉搜索树 二叉搜索树(binary search tree)满足以下条件: 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值。 对于任意节点的左、右子树也是二叉搜索树,同样满足上一条件。 二叉搜索树的操作 我们将二叉搜索树封装为一个类BinarySearchTree,并声
阅读全文
摘要:二叉树数组表示 在链表表示下,二叉树的存储单元为节点TreeNode,节点之间通过指针相连接。同前面的队列或栈,二叉树同样可以使用数组来表示。 表示完美二叉树 给定一棵完美二叉树,我们将所有节点按照层序遍历的顺序存储在一个数组中,则每个节点都对应唯一的数组索引。 按照层序遍历的特性,我们可以推导处父
阅读全文
摘要:二叉树 二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。 struct TreeNode{ int val; // 节点值 TreeNode *l
阅读全文