数据结构与算法分析
文章平均质量分 89
派大星45599
这个作者很懒,什么都没留下…
展开
-
二分搜索法的探究与心得
left + 1!= right精确的边界控制:通过保持left和right之间的间隔,这种方法减少了边界值的特殊处理,使得代码更加简洁。逻辑一致性:更新left或right变得一致和直观,不再需要额外的if判断来避免包含或排除中点值。减少错误:由于不需要处理mid - 1或mid + 1,此方法减少了由于错误更新索引而导致的无限循环或漏掉正确元素的风险。清晰的搜索意图:代码清晰地表达了搜索意图,特别是在区间分割的策略上,这对于阅读和维护代码的人来说是一个巨大的优势。可扩展性。原创 2024-02-11 22:10:02 · 717 阅读 · 0 评论 -
状态压缩DP--最短Hamilton路径问题的状态压缩动态规划解法
状态压缩动态规划可以在处理特定类型的组合问题时非常有用,尤其是当问题涉及到需要考虑集合的所有子集时。在这个最短Hamilton路径问题中,我们需要考虑经过每个点恰好一次的所有可能路径。为了做到这一点,我们使用状态压缩DP来枚举所有可能的点的子集,然后计算在这个子集内部,以每个点作为终点的最短路径长度。我们使用一个整数来表示状态(即点的集合)。整数的每一位对应一个点,如果某一位是1,表示该点包含在集合中;如果是0,表示不包含。例如,对于4个点的图,二进制数1011。原创 2024-02-06 15:12:29 · 774 阅读 · 0 评论 -
动态规划解决棋盘覆盖问题:一步步教你理解
在这个问题中,我们用f[i][j]来表示考虑到第i列时,整个棋盘的前i列形成的状态为j的覆盖方式的总数。这里的j是一个二进制数,用来表示这一列的覆盖情况,每一位代表一行,0表示该行未被覆盖,1表示该行已被覆盖。关于二进制数举个例子:第 i 列 :011000第i+2列:000010在棋盘覆盖这样的问题中,使用二进制数来表示状态是一种非常有效的方法。它可以直观地表示每一列的覆盖状态,其中每一位代表一行是否被覆盖。在你提供的例子中,我们可以将第 i 列和第 i+2 列的覆盖状态表示为二进制数。原创 2024-02-06 11:26:57 · 1011 阅读 · 0 评论 -
统计数字出现次数的数位动态规划解法-数位统计DP
数位DP是一种用于解决与数字的各个数位相关的问题的动态规划技术。它通常涉及到将问题分解为更小的、更易于管理的子问题,然后使用递归或迭代来解决这些子问题,同时避免重复计算。数位DP问题的关键在于如何定义状态和状态转移方程。在数位统计问题中,一个常见的状态定义包括:当前处理的数位位置(从最低位到最高位)当前数位的取值范围是否受到限制(即是否需要与给定的上限数值相匹配)其他可能影响问题解的额外条件,如前导零的处理、特定数位的取值等状态转移则依赖于当前处理的数位以及之前数位的选择如何影响后续数位的选择。原创 2024-02-06 01:31:16 · 1625 阅读 · 0 评论 -
动态规划之数位统计DP---整数划分问题
方法四中的状态定义。原创 2024-02-04 21:52:30 · 742 阅读 · 0 评论 -
最短编辑距离问题与动态规划----LeetCode 72.编辑距离
在这个问题中,我们定义f[i][j]为从word1的前i个字符转换到word2的前j个字符所需的最少操作次数。这个定义本身就隐含了一个最优子结构的性质,即要得到f[i][j]的值,我们可以依赖于f[i-1][j]f[i][j-1]和的值,这些都是更小的子问题。原创 2024-02-04 15:04:50 · 886 阅读 · 0 评论 -
做了三遍才懂的动态规划之线性DP---LeetCode 300. 最长递增子序列
为了构造尽可能长的上升子序列,我们采取的策略是让子序列的增长尽可能慢,即在相同长度的子序列中,选择末尾数最小的一个。:在所有长度相同的递增子序列中,末尾元素越小,为后续元素提供加入递增子序列的可能性越大,从而可能形成更长的递增子序列。数组中尽可能地使用较小的值,我们为后续的元素留出了更多的上升空间,从而使得整个上升子序列尽可能地长。数组中的所有元素,这意味着我们找到了一个更长的上升子序列,因此我们需要扩展。的上升子序列中末尾元素的最小值。数组中的正确位置,从而可以通过尽可能小的更新来延长上升子序列的长度。原创 2024-02-04 00:34:29 · 975 阅读 · 0 评论 -
顺时针打印矩阵:偏移量法与边界控制法比较---剑指offer-JZ29 顺时针打印矩阵
矩阵遍历使用的x和y的定义有些特殊。通常,在数学和计算机图形学中,我们习惯于将x轴定义为水平方向,y轴定义为垂直方向。然而,在二维数组或矩阵的上下文中,这些轴的定义通常与传统的笛卡尔坐标系有所不同。在代码中x变量代表的是二维数组的行索引。y变量代表的是二维数组的列索引。然而,当我们说“向上”移动时,实际上是在减少x的值(因为在数组中向上移动意味着向更小的行索引移动)。同样,"向右"移动实际上是增加y的值(在数组中向右移动意味着向更大的列索引移动)。“向下”移动是增加x的值。“向左”移动是减少y。原创 2024-01-22 20:45:07 · 1198 阅读 · 0 评论 -
位运算实现整数加法解析与实现---剑指offer-JZ65 不用加减乘除做加法
在计算机科学和编程中,位运算是一种高效的运算方式,尤其是在资源受限的环境下。最近,我遇到了一个有趣的问题:如何仅使用位运算实现两个整数的加法?这个问题不仅仅是一个编程练习,更深入地理解了计算机如何在底层处理数据。原创 2024-01-19 03:55:28 · 756 阅读 · 0 评论 -
深入理解归并排序与逆序对计算---剑指offer-JZ51 数组中的逆序对
当我们合并两个子数组时,如果左侧数组的元素大于右侧数组的元素,那么左侧数组当前元素及其后面的所有元素都将与右侧的这个元素形成逆序对。通过这种方式,函数在合并两个子数组的同时,准确地统计了逆序对的数量。如果左侧元素大于右侧元素,那么左侧的这个元素和它右边的所有元素(因为左侧子数组是有序的)都会与右侧的这个元素形成逆序对。因为左侧数组是有序的,所以如果一个左侧元素大于右侧的元素,那么左侧这个元素及其后面的所有元素都大于这个右侧的元素。函数中的核心,它负责合并两个已排序的子数组,并在这个过程中计算逆序对的数量。原创 2024-01-18 21:05:33 · 1410 阅读 · 0 评论 -
官方题解说明---剑指offer-JZ44 数字序列中某一位的数字
是172,则它会落在2位数的区间,因为172超过了1位数区间的长度(9),但不超过1位数和2位数区间总长度(9+180=189)。对应的是几位数的数字,然后找到具体的数字,最后确定是该数字的哪一位。是172 - 9 = 163,表示172是2位数区间的第163位。每个区间的起始数字是1、10、100等,这些数字是以10的幂递增的。,表示172是数字91的第1位(从0开始计数),所以答案是9。在上面的例子中,2位数的起始数字是10,区间长度是180。加上区间的起始数字,就可以找到具体的数字。原创 2024-01-18 03:05:58 · 367 阅读 · 0 评论 -
字符串排列:递归回溯算法的优化---剑指offer-JZ38 字符串的排列
定义一个递归函数来实现DFS,该函数通常包含当前选择状态的参数。原创 2024-01-18 03:02:50 · 830 阅读 · 0 评论 -
深入理解二叉树的序列化和反序列化---剑指offer-JZ37 序列化二叉树
序列化过程采用前序遍历,将每个节点的值转换为字符串,并用特殊字符(如'#')表示空节点。反序列化过程则根据这个字符串重新构建出原始的二叉树结构。原创 2024-01-18 01:15:58 · 934 阅读 · 0 评论 -
将二叉搜索树转换成排序的双向链表:深入解析与实现 ——剑指offer - JZ36 二叉搜索树与双向链表
在双向链表中,尾节点是最后一个节点,即没有后继节点的节点。在从二叉搜索树转换成的双向链表中,尾节点是树中值最大的节点,因为二叉搜索树的特性决定了任何节点的右子树包含的值都大于该节点,所以最右侧的节点是值最大的。原创 2024-01-12 23:24:41 · 447 阅读 · 0 评论 -
深入解析DFS回溯算法 ——剑指offer - JZ34 二叉树中和为某一值的路径(二)
深度优先搜索是解决树和图相关问题的一个非常强大的工具。通过本文的分析和代码实现,我们可以看到,DFS不仅能够高效地解决问题,而且在实现上也相对直观。对于初学者来说,理解递归和回溯是理解此类问题的关键。希望这篇博客能帮助你更好地理解和应用深度优先搜索来解决二叉树路径问题。原创 2024-01-12 23:20:25 · 861 阅读 · 1 评论 -
验证二叉搜索树的后序遍历序列 ——剑指offer - JZ33 二叉搜索树的后序遍历序列
这个问题的关键在于理解二叉搜索树的性质以及后序遍历的特点。通过使用栈和逆序遍历,我们能够有效地验证给定序列是否可能是某二叉搜索树的后序遍历结果。这不仅是对树的一次深入了解,也是对栈这一数据结构的一次巧妙应用。原创 2024-01-12 23:11:36 · 373 阅读 · 1 评论 -
深入解析DFS回溯算法 ——剑指offer - JZ12 矩阵中的路径
在许多计算机科学的应用中,我们经常会遇到需要在二维网格或矩阵中搜索特定路径的问题。这样的问题不仅仅是编程练习中的常见题目,它们也广泛存在于现实世界的场景中,比如电子游戏中的路径寻找、机器人导航、甚至在生物信息学中寻找DNA序列的模式匹配。本文讨论的问题是这样一个经典问题:给定一个由字母构成的二维网格(或称之为字符矩阵)和一个字符串(单词),要求判断该单词是否能够通过在网格中上下左右连续移动得到。原创 2023-12-15 03:50:07 · 937 阅读 · 0 评论 -
《算法通关村第一关——链表青铜挑战笔记》
跟着算法村重温链表原创 2023-08-15 00:42:23 · 29 阅读 · 0 评论 -
KMP算法学习笔记
萌新的学习笔记原创 2023-05-04 19:49:34 · 241 阅读 · 1 评论