算法和数据结构
文章平均质量分 80
算法和数据结构
shangjg3
这个作者很懒,什么都没留下…
展开
-
Leetcode算法题总结6-树
一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。平衡树左右子树高度差都小于等于 1。3 两节点的最长路径。原创 2024-08-02 22:56:04 · 208 阅读 · 0 评论 -
Leetcode算法题总结5-数组和矩阵
题目描述:S[i] 表示一个集合,集合的第一个元素是 A[i],第二个元素是 A[A[i]],如此嵌套下去。题目描述:数组的度定义为元素出现的最高频率,例如上面的数组度为 3。让前 k+1 个元素构建出 k 个不相同的差值,序列为:1 k+1 2 k 3 k-1 ... k/2 k/2+1.6. 一个数组元素在 [1, n] 之间,其中一个数被替换为另一个数,找出重复的数和丢失的数。n 的整数,要求构建数组,使得相邻元素的差值不相同的个数为 k。主要思想是通过交换数组元素,使得数组上的元素在正确的位置上。原创 2024-08-01 22:14:20 · 276 阅读 · 0 评论 -
数据结构常见算法题总结4-字符串
由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,不再使用 HashMap。s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。使用长度为 256 的整型数组来统计每个字符出现的个数,每个字符有偶数个可以用来构成回文字符串。记录一个字符上次出现的位置,如果两个字符串中的字符上次出现的位置一样,那么就属于同构。因为回文字符串最中间的那个字符可以单独出现,所以如果有单独的字符就把它放到最中间。原创 2024-07-31 18:06:02 · 289 阅读 · 0 评论 -
数据结构常见算法题总结3-栈和队列
而队列的默认插入顺序是队列尾部,因此在将 x 插入队列尾部之后,需要让除了 x 之外的所有元素出队列,再入队列。使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序。在遍历数组时用栈把数组中的数存起来,如果当前遍历的数比栈顶元素来的大,说明栈顶元素的下一个比它大的数就是当前元素。对于实现最小值队列问题,可以先将队列使用栈来实现,然后就将问题转换为最小值栈,这个问题出现在 编程之美:3.7。4. 用栈实现括号匹配。原创 2024-07-29 18:01:30 · 247 阅读 · 0 评论 -
数据结构常见算法题总结2-哈希表
例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1)。,利用 HashMap 就可以存储精简后的 url 到原始 url 的映射,使得不仅可以显示简化的 url,也可以根据简化的 url 得到原始 url 从而定位到正确的资源�) /,利用 HashMap 就可以存储精简后的 url 到原始 url 的映射,使得不仅可以显示简化的 url,也可以根据简化的 url 得到原始 url 从而定位到正确的资源�)要求以 O(N) 的时间复杂度求解。原创 2024-07-28 21:46:09 · 359 阅读 · 0 评论 -
数据结构常见算法题总结1-链表
node1 节点先跑,node1 节点 跑到第 n+1 个节点的时候,node2 节点开始跑.当 node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L - n ) 个节点(L 代表总链表长度,也就是倒数第 n + 1 个节点)首先两个节点/指针,一个节点 node1 先开始跑,指针 node1 跑到 k-1 个节点后,另一个节点 node2 开始跑,当 node1 跑到最后时,node2 所指的节点就是倒数第 k 个节点也就是正数第(L-K+1)个节点。将两数相加返回一个新的链表。原创 2024-07-27 11:41:43 · 364 阅读 · 0 评论 -
数据结构总结6-布隆过滤器
Guava 提供的布隆过滤器的实现还是很不错的(想要详细了解的可以看一下它的源码实现),但是它有一个重大的缺陷就是只能单机使用(另外,容量扩展也不容易),而现在互联网一般都是分布式的场景。如果我们需要判断某个字符串是否在布隆过滤器中时,只需要对给定字符串再次进行相同的哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。并且,理论情况下,添加到集合中的元素越多,误报的可能性就越大。原创 2024-07-25 03:00:00 · 1000 阅读 · 0 评论 -
数据结构总结5-图
边表示的是顶点之间的关系,有的关系是双向的,比如同学关系,A 是 B 的同学,那么 B 也肯定是 A 的同学,那么在表示 A 和 B 的关系时,就不用关注方向,用不带箭头的边表示,这样的图就是无向图。对于一个关系,如果我们既关心关系的有无,也关心关系的强度,比如描述地图上两个城市的关系,需要用到距离,那么就用带权图来表示,带权图中的每一条边一个数值表示权值,代表关系的强度。在无向图中,邻接表元素个数等于边的条数的两倍,如左图所示的无向图中,边的条数为 7,邻接表存储的元素个数为 14。原创 2024-07-24 10:26:46 · 766 阅读 · 0 评论 -
数据结构总结4-堆
将初始的无序数组抽象为一棵树,图中的节点个数为 6,所以 4,5,6 节点为叶节点,1,2,3 节点为非叶节点,所以要对 1-3 号节点进行自顶向下(沉底)堆化,注意,顺序是从后往前堆化,从 3 号节点开始,一直到 1 号节点。先回答第一个问题,我们需要执行自顶向下(沉底)堆化,这个堆化一开始要将末尾元素移动至堆顶,这个时候末尾的位置就空出来了,由于堆中元素已经减小,这个位置不会再被使用,所以我们可以将取出的元素放在末尾。:删除堆顶元素,将末尾元素放至堆顶,再自顶向下堆化,将堆顶元素下沉。原创 2024-07-24 10:01:41 · 644 阅读 · 0 评论 -
数据结构总结3-红黑树
二叉查找树是一种基于比较的数据结构,它的每个节点都有一个键值,而且左子节点的键值小于父节点的键值,右子节点的键值大于父节点的键值。但相比于 AVL 树,高度平衡所带来的时间复杂度,红黑树对平衡的控制要宽松一些,红黑树只需要保证黑色节点平衡即可。从任意节点到它的叶子节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。如果节点是红色的,则它的子节点必须是黑色的(反之不一定)。这里指的是红黑树都会有一个空的叶子节点,是红黑树自己的规则。染色时根据当前节点的爷爷节点,找到当前节点的叔叔节点。原创 2024-07-23 17:23:32 · 241 阅读 · 0 评论 -
数据结构总结2-树形数据结构
根结点的序号为 1,对于每个节点 Node,假设它存储在数组中下标为 i 的位置,那么它的左子节点就存储在 2i 的位置,它的右子节点存储在下标为 2i+1 的位置。细心的小伙伴可能发现了,当根节点的值为 1 的情况下,若父结点的序号是 i,那么左子节点的序号就是 2i,右子节点的序号是 2i+1。二叉树的先序遍历,就是先输出根结点,再遍历左子树,最后遍历右子树,遍历左子树和右子树的时候,同样遵循先序遍历的规则,也就是说,我们可以递归实现先序遍历。:一个节点含有的子树的根节点称为该节点的子节点。原创 2024-07-23 17:12:00 · 356 阅读 · 0 评论 -
数据结构总结1-线性数据结构
为了避免当只有一个元素的时候,队头和队尾重合使处理变得麻烦,所以引入两个指针,front 指针指向对头元素,rear 指针指向队列最后一个元素的下一个位置,这样当 front 等于 rear 时,此队列不是还剩一个元素,而是空队列。除此之外,链表不具有数组随机读取的优点。2. 队列为空的时候就是 front==rear ,队列满的时候,我们保证数组还有一个空闲的位置,rear 就指向这个空闲位置,如下图所示,那么现在判断队列是否为满的条件就是:(rear+1) % QueueSize==front。原创 2024-07-18 17:43:44 · 911 阅读 · 0 评论