数据结构与算法
文章平均质量分 71
masterleoo
这个作者很懒,什么都没留下…
展开
-
插入排序、冒泡排序、选择排序、快速排序、归并排序、堆排序
插入排序、冒泡排序、选择排序、快速排序原创 2023-09-06 21:50:40 · 346 阅读 · 0 评论 -
【深度优先搜索】机器人的运动范围,中等难度,需要注意初始节点
【深度优先搜索】机器人的运动范围,中等难度,需要注意初始节点原创 2023-07-19 09:41:19 · 47 阅读 · 0 评论 -
【深度优先搜索】矩阵中的路径,中等难度,有易错点
【深度优先搜索】矩阵中的路径,中等难度,有易错点原创 2023-07-14 11:04:24 · 66 阅读 · 0 评论 -
【深度优先搜索】经典例题:岛屿的最大面积 + 岛屿数量
【深度优先搜索】经典例题:岛屿的最大面积 + 岛屿数量原创 2023-07-07 11:29:07 · 139 阅读 · 1 评论 -
【按之字形顺序打印二叉树】队列数据结构的使用
【按之字形顺序打印二叉树】队列数据结构的使用原创 2023-06-12 22:48:26 · 64 阅读 · 0 评论 -
【合并两个排序的链表+反转链表】使用递归/迭代算法解决链表的问题,比较难理解,需要深入思考
3、初始值pre=nullptr,cur=pHead,然后当cur不为空节点的条件下遍历,用temp记录当前节点的下一节点cur->next,再令当前节点cur指向前一节点pre,即cur->next = pre,并更新pre和cur,让两者都向后移动一个节点,即pre = cur,cur = temp。2、要反转链表,就是在遍历链表的过程中,让当前节点的next等于前一节点即可,那我们可以定义三个节点:pre,cur,temp分别记录当前节点的前一节点、当前节点、当前节点的后一节点。原创 2023-06-09 10:20:03 · 72 阅读 · 0 评论 -
【不同路径+最小路径和+最长回文子串】二维动态规划:建立二维数组解决动规
那么状态转移方程为dp[i][j] = grid[i][j] + min( dp[i-1][j], dp[i][j-1] );1)定义dp数组:我们定义dp[i][j]为到达第i行第j列的网格的最小路径和,注意i和j从0开始,与代码中数组的定义一致,那么最后到达右下角的最小路径和为dp[m-1][n-1];1)定义dp数组:我们定义dp[i][j]为到达第i行第j列的网格的路径种类数,注意i和j从0开始,与代码中数组的定义一致,那么最后到达右下角的路径数为dp[m-1][n-1];原创 2023-06-07 20:14:50 · 159 阅读 · 0 评论 -
【连续子数组的最大和+爬楼梯】带你认识最简单的动态规划
2、定义状态转移方程:即如何利用dp[n-1],dp[n-2]……dp[1]来计算dp[n],例如dp[n] = dp[n-1] + dp[n-2],由于重叠子问题之间存在重复计算,那么状态转移方程描述的就是如何通过先前已经计算并保存的。原创 2023-06-06 00:27:02 · 52 阅读 · 0 评论 -
【遍历序列构造二叉树】更复杂的递归解法,需要深入思考
3、非边界条件就是原问题怎么分解为子问题,要构造二叉树,那么可以先获取根节点,再获取左右子树各自的范围区间,这样起码知道了哪些区间可以再用来构造左右子树,于是子问题不就可以继续分解下去:获取根节点—>寻找左右子树的区间。而中序数组恰好提供了左右子树的区间,根节点左/右边的区间为该根节点对应的左/右子树;4、对于非边界条件:可以这么想,子问题不断分解下去,左右子树的区间一定会变为0,此时就是边界条件,要返回空节点。前序遍历:根节点+左子树+右子树。中序遍历:左子树+根节点+右子树。原创 2023-06-02 17:18:57 · 39 阅读 · 0 评论 -
【x 的平方根 】二分查找,该题需要注意一些小细节
【代码】【x 的平方根 】二分查找,该题需要注意一些小细节。原创 2023-06-02 09:24:22 · 62 阅读 · 0 评论 -
【在排序数组中查找元素的第一个和最后一个位置】二分查找法,中等难度
我认为该问题可以先通过二分查找法找到任意一个等于target的元素,然后在其前后进行遍历,从而找到开始位置和结束位置。另一种解法:我的解法可能比较繁琐,看完官方解法以后,是采用二分法来对target的左右边界进行查找。可以分别写出查找左边界和右边界的函数。C++代码:注意数组越界的问题。原创 2023-06-02 00:04:14 · 215 阅读 · 0 评论 -
【用两个栈实现队列】队列的概念+使用栈实现队列,存在易错点
【代码】【用两个栈实现队列】队列的概念+使用栈实现队列,存在易错点。原创 2023-05-31 22:18:17 · 112 阅读 · 1 评论 -
【从尾到头打印链表】递归与栈的直接联系
【代码】【从尾到头打印链表】递归与栈的直接联系。原创 2023-05-31 15:40:42 · 43 阅读 · 1 评论 -
【二分查找+搜索插入位置】二分查找法初探
上述问题的关键在于升序排序的数组,因此可以不去使用暴力解法进行遍历,而是采用二分查找。综上,二分查找尤其需要考虑的是循环结束条件以及返回值。原创 2023-05-30 22:42:03 · 108 阅读 · 1 评论 -
【环形链表】两种解法:哈希表和快慢指针
初始时,慢指针在位置 head,而快指针在位置 head->next,如果为环形链表,那么在进入环之后快指针一定会追上慢指针,即两个指针相同;否则,快指针会先到尾结点。unordered_set<type> set是一种哈希表,可看做集合,只有key元素,没有value元素,因此内部元素不会重复,此外元素只能插入或者删除,不能被修改。可以遍历节点并存入哈希表中,同时检测哈希表中是否有重复节点,即转化为检测重复元素的问题,由于只需要key,因此使用C++的unordered_set或者python的set。原创 2023-05-29 22:00:59 · 263 阅读 · 1 评论 -
递归的进一步理解—相同的树,翻转二叉树,对称二叉树
1)确定非边界条件,考虑原问题怎么分解为子问题:对称二叉树要求左右子树对称,进一步考虑,要求左右子树的当前节点相同,以及左子树当前节点的左孩子(子树)和右子树当前节点的右孩子(子树)相同+左子树当前节点的右孩子(子树)和右子树当前节点的左孩子(子树)相同,因此我们可以另外创建一个函数进行上述递归过程(什么时候需要另外创建函数要仔细考虑);1)确定非边界条件,即原问题怎么分解为子问题:要使两棵树完全相同,那么从根节点开始,要保证当前节点以及它的左子树和右子树也相同,左/右子树又可以继续分解下去;原创 2023-05-27 11:49:45 · 87 阅读 · 1 评论 -
二叉树的最大深度—对递归的初步理解
非边界条件即子问题要返回给上一级问题的结果为max(左子树的最大深度,右子树的最大深度)+1。递归简单来说,就是不断调用自身,这与循环有点像,但区别是循环是在不断执行同一段代码块,而递归需要将当前的结果不断返回给上一级。4、于是从边界条件开始,子问题的结果会不断返回到原问题,直到递归结束,因此递归使用了一个数据结构—栈,利用了其后入先出的特点,在前行阶段即。的过程中,将函数的局部变量、参数等压入栈中,在到达边界后的退回过程中,将栈顶的元素不断弹出,返回给上一级函数。子问题:左/右子树的最大深度。原创 2023-05-22 22:15:35 · 316 阅读 · 1 评论