数据结构
文章平均质量分 66
AI专题精讲
更多专题内容,欢迎关注微信公众号:AI专题精讲
最新论文分享网站:www.aizhuanlan.net
数学公式Latex识别: www.aikitbox.net
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
单调栈算法讲解
单调栈是一种维护元素单调性的栈结构,用于高效解决“查找元素左右第一个更大/更小值”的问题。其核心在于通过栈内元素的单调性(递增或递减)将时间复杂度优化至O(n)。常见应用包括:下一个更大元素、柱状图最大矩形、接雨水等。单调栈的关键在于栈内存储未找到答案的元素,通过延迟决策实现高效处理。典型题目如每日温度(计算更高温度的天数差)、移掉K位数字(贪心+单调栈)等,通常栈中存储下标以计算距离或区间。掌握单调栈的四种变体(递增/递减,左/右扫描)及其本质(延迟决策)是解题的关键。原创 2026-01-21 15:39:22 · 583 阅读 · 0 评论 -
排序算法分类及实现
排序算法可分为比较排序(如冒泡、快速排序)和非比较排序(如计数、基数排序)。常见分类方式包括时间复杂度、空间复杂度和稳定性。比较排序理论下限为O(n log n),而非比较排序可突破这一限制。典型算法实现包括:冒泡排序(稳定O(n²))、快速排序(不稳定O(n log n))、归并排序(稳定O(n log n))和堆排序(不稳定O(n log n))。非比较排序如计数排序在特定条件下可达O(n)时间复杂度,但需要额外空间。每种算法各有特点,适用于不同场景和数据特征。原创 2026-01-13 09:36:43 · 528 阅读 · 0 评论 -
动态规划分类及算法实现
动态规划是一种通过分解问题为重叠子问题并存储子问题解以提高效率的算法方法。其核心特点包括最优子结构、重叠子问题和状态转移方程。动态规划可分为多种类型:按状态转移方式分为线性DP、区间DP、树形DP等;按问题类型分为背包问题、序列问题等。文中给出了四个经典动态规划问题的实现:最长递增子序列(LIS)通过比较元素值更新状态矩阵;矩阵连乘问题通过区间分割优化计算顺序;0-1背包问题通过逆序遍历容量确保物品只选一次;二叉树盗贼问题通过递归处理节点选择与否的最大收益。这些算法展示了动态规划在不同场景下的灵活应用。原创 2026-01-12 10:42:38 · 726 阅读 · 0 评论 -
并查集的思想及代码实现
摘要:并查集是一种高效处理不相交集合合并与查询的树型数据结构,核心操作包括查找(带路径压缩优化)和合并(按秩合并)。其平均时间复杂度接近常数O(α(n)),适用于连通性问题、最小生成树算法等场景。典型实现包含父指针数组和秩数组,通过路径压缩和按秩合并保持高效性。并查集特别适合解决动态连通性问题,是图论和网络连接问题的重要工具。原创 2026-01-07 14:11:11 · 366 阅读 · 0 评论 -
左移和右移运算符如何表示
【代码】左移和右移运算符如何表示。原创 2025-01-24 09:10:07 · 955 阅读 · 0 评论 -
位运算的应用场景
位运算在LeetCode数据结构题目中的应用场景广泛,主要用于高效处理二进制位、状态压缩及优化特定操作。掌握这些场景与技巧,能高效解决LeetCode中涉及位运算的题目,尤其在处理二进制、状态压缩和数学替代时优势显著。原创 2025-01-24 09:00:39 · 666 阅读 · 0 评论 -
在二进制中,INT_MIN 的值是 100...000,表示最小的负整数。 最高位是符号位,这个值不是0么
INT_MIN 的二进制表示是,符号位为1,表示负数。最高位是符号位,在二补码表示法中,符号位为1表示负数。INT_MIN是二补码中的最小负数,无法通过-INT_MIN直接转换为正数,因此它在某些操作中需要特别处理。原创 2025-01-21 15:36:36 · 609 阅读 · 0 评论 -
Trie树讲解及代码实现
它将多个字符串存储在一棵树中,共享相同前缀的字符串在 Trie 树中拥有相同的路径,从而节省空间并提高查询效率。Trie 树(也称为前缀树或字典树)是一种用于存储和检索字符串的高效数据结构,特别适用于字符串前缀匹配的场景。通过这个实现和解释,你可以理解并使用 Trie 树进行高效的字符串存储和检索。是查询字符串的长度。共享前缀的字符串只存储一份前缀部分,适合大量字符串的存储。是字符串的长度,因为每个字符都需要被遍历并插入到树中。需要检查前缀的每个字符是否存在。需要遍历字符串的每个字符。原创 2024-12-17 08:55:59 · 674 阅读 · 0 评论 -
摩尔投票算法的核心思想
摩尔投票算法(Moore’s Voting Algorithm),通常被称为“投票算法”,是一种用于在众多元素中找出出现次数超过半数的元素(即多数元素)的高效算法。这种算法特别适用于解决“多数元素问题”,即在一个序列中找出一个出现次数超过n/2的元素(如果存在的话)。原创 2024-07-30 14:38:45 · 529 阅读 · 0 评论 -
最小生成树(Minimum Spanning Tree, MST)
以下是Prim算法在C++中的实现。这个实现使用了优先队列(堆)来选择权重最小的边,并逐步构建最小生成树。中,使得所有节点连通且总权重最小的一棵树。设置图的顶点和边,调用 Kruskal 算法并输出最小生成树。实现Prim算法,使用优先队列(最小堆)来选择最小权重的边。并查集实现,用于管理顶点集合,并支持路径压缩和按秩合并。以下是Kruskal算法在C++中的实现。:设置图的顶点和边,调用Prim算法并输出最小生成树。这个实现适用于任意无向加权图,并高效地找到最小生成树。Kruskal算法的实现。原创 2024-07-01 10:25:42 · 1892 阅读 · 0 评论 -
差分数组算法
对于数组aaa,定义其差分数组(difference array)为dia0i0ai−ai−1i≥1dia0ai−ai−1i0i≥1性质 1:从左到右累加ddd中的元素,可以得到数组aaa。性质 2:如下两个操作是等价的。把aaa的子数组aiai1⋯ajaiai1⋯aj都加上xxx。把did[i]di增加xxx,把dj1d[j+1]dj1减少xxx。原创 2024-05-15 10:00:16 · 958 阅读 · 0 评论 -
二叉树遍历算法
【代码】二叉树遍历算法。原创 2024-05-09 17:56:04 · 293 阅读 · 0 评论 -
哈希函数算法
链地址法:为每个哈希值维护一个链表,并将具有相同哈希值的元素都放入这一链表当中。开放地址法:当发现哈希值 hhh 处产生冲突时,根据某种策略,从h出发找到下一个不冲突的位置。例如,一种最简单的策略是,不断地检查h1h2h3h1h2h3h1h2h3这些整数对应的位置。再哈希法:当发现哈希冲突后,使用另一个哈希函数产生一个新的地址。basehashxxmodbase我们开辟一个大小为base的数组,数组的每个位置是一个链表。原创 2024-04-14 08:52:54 · 825 阅读 · 0 评论 -
欧拉回路算法
Hierholzer和Fleury算法的基本思路差不多,在DFS时找环。Fleury使用分段策略,找到一条环后,以环中某一个还存在邻接边的节点重新开始使用DFS找环,直到找到所有环。Hierholzer算法很有技巧性,在回溯时检查节点是否还有邻接边,有则重新DFS直到完毕。原创 2024-04-08 10:47:27 · 3529 阅读 · 2 评论 -
双连通分量算法
无向图任意两点之间存在通路。有向图(前提)中,任意两点都有至少一条通路,则此图为强连通图。弱连通图:将有向图的有向边换成无向边得到的图是连通图,则此有向图是弱连通图。原创 2024-04-06 23:12:25 · 2562 阅读 · 0 评论 -
字符串匹配算法
Rabin-Karp 算法(也可以叫 Karp-Rabin 算法),由 Richard M. Karp 和 Michael O. Rabin 在 1987 年发表,它也是用来解决多模式串匹配问题的。它的实现方式有点与众不同,首先是计算两个字符串的哈希值,然后通过比较这两个哈希值的大小来判断是否出现匹配。原创 2024-02-26 10:57:11 · 853 阅读 · 1 评论 -
最短路径算法
在正数权重的有向图中求解某个源点到其余各个顶点的最短路径一般可以采用迪杰斯特拉算法(Dijkstra算法)。原创 2024-02-12 22:17:24 · 1878 阅读 · 0 评论 -
计数排序算法
计数排序是一种非比较排序,使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。原创 2024-01-28 10:37:44 · 445 阅读 · 0 评论 -
基数排序算法
(1)通过键值得各个位的值,将要排序的元素分配至一些桶中,达到排序的作用(2)基数排序法是属于稳定性的排序,基数排序法是效率高的稳定排序法(3)基数排序是桶排序的扩展。原创 2024-01-25 10:53:10 · 556 阅读 · 0 评论 -
快速选择算法
适用于求数组中的第K个最大元素。原创 2024-01-23 10:25:15 · 1114 阅读 · 0 评论 -
水塘抽样算法
最近经常能看到面经中出现在大数据流中的随机抽样问题即:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。假设数据流含有N个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应该为 1/N那如何保证呢?原创 2024-01-21 08:54:24 · 481 阅读 · 0 评论 -
线段树算法(Segment Tree)
【代码】线段树基础知识。原创 2024-01-01 11:25:05 · 1440 阅读 · 0 评论 -
状态压缩-bitmask
【代码】状态压缩-bitmask。原创 2023-07-03 09:31:04 · 176 阅读 · 0 评论 -
回溯-求排列组合
【代码】回溯-求排列组合。原创 2023-06-17 15:45:08 · 123 阅读 · 0 评论 -
回溯 N-Queens
【代码】回溯 N-Queens。原创 2023-06-12 20:37:40 · 146 阅读 · 0 评论 -
动态规划-股票交易
【代码】动态规划-股票交易。原创 2023-06-01 11:09:13 · 173 阅读 · 0 评论 -
动态规划-序列型动态规划
【代码】动态规划-回文串。原创 2023-05-30 09:12:00 · 186 阅读 · 0 评论 -
二叉树-二叉树还原
【代码】二叉树-二叉树还原。原创 2023-05-18 19:16:29 · 166 阅读 · 0 评论 -
数组-二分查找
【代码】数组-二分查找。原创 2023-05-09 14:34:09 · 175 阅读 · 0 评论 -
字符串-字符串匹配
【代码】字符串-字符串匹配。原创 2023-04-28 16:31:45 · 159 阅读 · 0 评论 -
数学-字符串相乘
【代码】数学-字符串相乘。原创 2023-04-26 17:21:07 · 120 阅读 · 0 评论 -
二叉树-层次遍历
【代码】二叉树-层次遍历。原创 2023-04-23 13:46:03 · 93 阅读 · 0 评论 -
链表-反转链表
【代码】数据结构-反转链表。原创 2023-04-23 10:42:56 · 217 阅读 · 0 评论 -
数组-双指针
思路:快指针正常向前,慢指针在某些情况下向前。, 删除数组中等于val元素,返回数组长度,,这样可以避免第一个元素进行特殊处理。原创 2023-03-29 10:52:53 · 118 阅读 · 0 评论 -
树状数组或二叉索引树(Binary Indexed Tree)
双指针应用时,需要创建虚拟节点,这样可以避免第一个元素进行特殊处理。原创 2023-03-27 16:28:01 · 628 阅读 · 0 评论 -
原码、反码、补码
在计算机当中都是使用补码来进行计算和存储的。补码很好的解决了反码负数不能跨零计算的弊端,并且补码还可以记录一个特殊的值 -128,这个数据在 1 个字节下是没有原码和反码。在二进制里,最高位为符号位,用0和1来表示正负,最高位为1代表负数,最高位为0代表正数。负数的二进制表示分为三步:step1: 把这个负数的绝对值转换为二进制,即求原码step2: 把原码取反,即求反码step3: 把反码加1,即求补码例如把 -5 转换为二进制,假设-5为Java中的byte类型。原创 2023-03-14 15:33:21 · 1286 阅读 · 0 评论
分享