算法
念念大侠
勿眼高手低,脚踏实地
展开
-
代码随想录之二叉搜索树的插入操作
迭代法的思想就是找到最适合插入的结点,在最适合插入的结点来进行插入操作。思路:本题的思想较为简单,直接找到适合插入的结点来进行插入即可。原创 2023-07-13 16:40:27 · 509 阅读 · 0 评论 -
代码随想录之二叉搜索树中的众数
思路:二叉搜索树相关的算法题要使用到二叉搜索树的特性,本题的难点是如何将出现相同次数的众数保存起来,以及count条件的转换。总结:本题的难点是终止条件的判断,以及最大的众数的切换的条件,迭代的思路与上一题中大致相同,只需要注意条件的改变。解法二:使用迭代的方式,二叉树的中序遍历。解法一:使用递归的方法来完成。原创 2023-07-10 10:58:27 · 361 阅读 · 0 评论 -
代码随想录之二叉搜索树的最小绝对值差
思路:本题是二叉排序树,所以我们进行中序遍历就能将二叉树按照递增的顺序来进行排序,然后我们只需要比较两个相邻的结点找到最小值即可。解法3: 将该二叉树使用中序遍历得到一个新的数组,再在数据中找到两个两个之间的最小绝对值的差。递归:思路与上题验证二叉搜索树有着相同的思想,使用pre结点来保存上一个结点,然后进行节点之间的比较。迭代的思想去输出,将中序遍历的迭代法改善一下即可。原创 2023-07-09 16:21:12 · 325 阅读 · 0 评论 -
代码随想录之验证二叉搜索树
递归的解法思路与简洁迭代的思路相同,中序遍历来进行结点的比较。因为右子树比中间结点的值要大,所以max=root应该在跳转右节点之前。按照中序遍历的迭代去写,本题最主要的是平衡结点的判定条件,思路是每次都与前一个结点来进行对比,重点以及易错点就是下面备注的地方。解法一:使用简洁迭代的思想。解法二:使用递归的解法。原创 2023-07-07 13:42:07 · 214 阅读 · 0 评论 -
代码随想录之二叉搜索树中的搜索
解法二:使用二叉树的迭代法,使用栈来直接完成迭代的过程,不使用二叉搜索树的特性。使用递归的解法,主要是利用二叉搜索数的特性来完成。解法三:使用二叉搜索树的特性来完成迭代。原创 2023-05-09 17:41:03 · 95 阅读 · 0 评论 -
代码随想录之合并二叉树
将两棵树都合并成为一棵树root1,把root1作为合并后的结果来返回。本题说明,本题有两种思路,分别是递归的方法与迭代的方法。原创 2023-05-08 19:41:25 · 74 阅读 · 0 评论 -
代码随想录之构造最大二叉树
本题思路:本题是使用构造二叉树的思路去完成,二叉树构造的题目一定要用先序的顺序去构造。同时思路在题目中的数组都是左闭右开。找每一组当中的最大值的写法。原创 2023-05-08 18:52:32 · 70 阅读 · 0 评论 -
代码随想录之根据前序与中序序列构造二叉树
【代码】代码随想录之根据前序与中序序列构造二叉树。原创 2023-04-29 19:13:29 · 66 阅读 · 0 评论 -
代码随想录之路经总和
解法二:使用层序遍历,将父亲节点的值加到子节点当中去,然后使用层序遍历的方式,依次遍历结点,判断结点的值是否与target相同。本题的思路较为简单,只需要用target来减去值即可。本题使用了时间回溯的解法,因为要返回的是具体的路径。本题的结束条件需要判断target与每一个值。解法一:使用递归的方法。原创 2023-04-27 17:33:01 · 112 阅读 · 0 评论 -
代码随想录之找树左下角的值
使用递归的方法,找到也在最左下角的叶子节点。从最高层开始向下去寻找,同时记录二叉树结点的深度,找到最大深度的左结点。笔者的思路是使用层序遍历的方法,一层一层的去遍历,每一层中的第一个就是最左边的叶子结点,直到找到最后一层的值。原创 2023-04-26 17:20:03 · 98 阅读 · 0 评论 -
代码随想录之左叶子之和
本题的递归的思路是,用后续遍历的方式,由上到下,把左右节点的值记录在中间的节点当中,由上到下把值加起来就得到了最终的结果,因为本题要找的是左叶子,左叶子的判断方法有点不同,注意本题当中递归的判断条件。使用迭代的解法,一个结点一个结点的进行判断。注意左右结点的判空操作。原创 2023-04-24 21:10:47 · 62 阅读 · 0 评论 -
代码随想录之二叉树的所有路径
解法一:递归 + 回溯。原创 2023-04-22 21:18:01 · 90 阅读 · 0 评论 -
代码随想录之平衡二叉树
用求深度的方法,用先序的方式来完成,从头结点开始,逐渐往下。用求高度的解法,从低到高,用后序遍历的方式来完成。解法二的实现不好写。原创 2023-04-22 19:44:11 · 152 阅读 · 0 评论 -
代码随想录之完全二叉树的节点个数
利用完全二叉数的特性,该解法,笔者没有想出来,也没有学会,记录在此。广度优先遍历,迭代法。原创 2023-04-21 20:42:40 · 94 阅读 · 0 评论 -
代码随想录之二叉树的最小深度
本题要求的是二叉树的最小深度,所以二叉树的终止条件发生改变,当只要左右结点只要有一个是空的时间就结束递归。在每次遍历一层的时间,判断这个结点是不是叶子结点,如果是叶子结点的话就return,因为求的是最小长度。本题的思路与求最大深度相似,但是有有不同。:迭代法,使用队列来模拟存储的过程。原创 2023-04-21 19:32:23 · 65 阅读 · 0 评论 -
代码随想录之二叉树的最大深度(补充n叉树的最大深度)
思想比较繁琐,因为length的++与–,每次进入一次递归,代表进入下一层,所以说leng需要++,但是当退出一层的递归表示返回上一层,这是的深度需要减减。N叉树的迭代与二叉树的区别在于N叉树要多加一个循环来判断N叉树的孩子,将N叉树的孩子一个一个加入队列当中。用后序遍历的方法,求出根节点的最大高度,返回根节点的值就是二叉树的最大深度。N叉树的最大深度,与二叉树的最大深度有很多相似的地方。二叉树的深度:二叉树中的结点到根节点的距离。使用迭代的方式,使用队列,进行层序遍历,计算层序的深度。原创 2023-04-21 19:04:21 · 72 阅读 · 0 评论 -
代码随想录之对称二叉树
本题中,要判断是否是二叉树,所以使用的是boolean类型,终止条件是,左右子树其中一个是null或者左右子树的值不相等。递归的是外层与外层结点,内层与内层的结点。只要内层与内层相同,且外层与外层相同,才返回true。使用队列来模拟结点的对比的过程。将外层结点与外层结点一起入队,内层与内层入队。最后比较这结点的值是否相同。解法三:使用栈,使用栈的思路与队列相同,不再赘述。外层:左节点的左孩子 和 右节点的右孩子。内层:左孩子的右节点 和 右孩子的左节点。2.确定递归的终止条件。原创 2023-04-21 16:25:58 · 69 阅读 · 0 评论 -
代码随想录之翻转二叉树
解法一:递归版,这里使用前序或者后序的递归都可以实现,如果使用中序的递归,需要注意结点的交换位置。解法二:使用层次遍历的方法来交换结点。原创 2023-04-19 18:57:38 · 140 阅读 · 0 评论 -
代码随想录之二叉树的层次遍历
思路:本题是二叉树的层次遍历,与图的广度优先遍历相同,使用队列来模拟存储的过程。主要的是本题返回的是一个二维的集合。原创 2023-04-19 14:47:06 · 88 阅读 · 0 评论 -
代码随想录之二叉树的遍历
思路:非递归使用的是栈来作为中介来存储值。先序遍历的属性是:根左右,所以我们在栈中先将根节点弹出,然后再右节点入栈,再左节点入栈,因为栈的入栈顺序是先进后出,所以我们应该先将右节点入栈。思路:中序遍历的代码与前序和后序的代码有所不同,中序遍历是需要我们先找到最左边的结点,当最右边的结点为空时再开始相集合中添加元素。思路:后序遍历我们只需要调整前序遍历的左右结点入栈顺序,最后再将得到的集合反转一下就行了。本题思路借鉴于代码随想录。原创 2023-04-18 21:59:12 · 85 阅读 · 0 评论 -
代码随想录之滑动窗口最大值
其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的,那么这个维护元素单调递减的队列就叫做单调队列,即单调递减或单调递增的队列。我们要创建的队列的每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。原创 2023-04-17 19:34:51 · 138 阅读 · 0 评论 -
代码随想录之逆波兰表达式求值
思路:本题使用栈的方法来完成。本题相当于后缀表达式求值,也是与匹配相关,所以也是使用栈的思路。1.注意先出栈的是作为符号后面的值,相当于除数,减数,第二次弹出的数作为被除数、被加数之类。2.String类型转化为Int类型的方法。原创 2023-04-17 15:46:51 · 67 阅读 · 0 评论 -
代码随想录之删除字符串中的所有相邻重复项
当题目当中有消去同类型或者什么什么匹配的时间,都可以考虑使用栈。原创 2023-04-17 14:41:50 · 79 阅读 · 0 评论 -
代码随想录之有效的括号
a与b的和,必须是c与d之和的相反数。这里也是,如果是左括号就将右括号入栈。最后循环,如果有右括号,就将stack中的弹出,如果不匹配就是false。这里的判断,如果是左符号,就将右符号入栈,然后再往后面判断,是这道题的主要思路,就同之前自己做的。解法:使用栈来完成对应。原创 2023-04-16 21:47:46 · 68 阅读 · 0 评论 -
代码随想录之用栈来实现队列
本题的思路较简单,主要一点就是要在每次出队的时间,将入栈里面的元素放到出栈里面去,要进行判断。原创 2023-04-16 20:53:16 · 63 阅读 · 0 评论 -
代码随想录之左旋转字符串
思路:在做完上一题旋转之后,我们再做字符串的旋转之类的题时就不会再感觉那么困难了。所以字符串的旋转都是部分旋转与整体旋转之间的联系关系。StringBuilder + 双指针。在原来数组的基础上操作 + 双指针。思路比较简单,不再赘述。原创 2023-04-16 18:53:21 · 99 阅读 · 0 评论 -
反转字符串中的单词(三种方法详细版)之代码随想录
“ ”的时间将这个值赋予满指针,难点是单词之间多个空格的情况,使用的是慢指针来添加空格,最后再创建一个慢指针长度的数组,将原数组中的值复制进去。1.该方法思路不难,主要是删除空格中最关键的一步比较难想出,如何使每个单词之间只有一个空格隔开,题目中使用的方法很巧妙。4.String.join()的意思是,将接受的数组或者集合,以参数一的形式分割开,再拼接成一个新的字符串。:本题是字符串的集大成之作,包含了去除字符串之间的空格,反转字符串,反转字符串中的单词。如果笔者陈述的方法有误,欢迎积极指正。原创 2023-04-16 16:10:57 · 881 阅读 · 0 评论 -
代码随想录之替换空格
思路:本题主要是StringBuffer与StringBuild类的学习使用。相当于动态的字符串。解法一:StringBuild的使用。原创 2023-04-15 21:00:26 · 58 阅读 · 0 评论 -
代码随想录之反转字符串||
思路:本题的难点是本题的题目较难理解,理解后可知其意思是,前2k个字母中的前k个反转,后k个保持不变。其中最后不足k个的全部反转,超过k个不足2k的部分保持不变。其中代码反转的部分与上一题反转字符串相同,反转部分主要就是看左右指针。与数组的长度之类的无关。所以左右指针只看k即可。1.for循环当中的跳转,理解题目后可知每次跳转多跳转2k个位置,所以说是i += 2*k;2.比较的最后一部分,要比较是否还有k个或者是不足k个,或者是超过k的不足2k的部分。4.再将字符数组转化为字符串的部分。原创 2023-04-15 20:18:13 · 71 阅读 · 0 评论 -
代码随想录之四树之和
思路:本题的解法与三数之和相同,不过本题中的target不是0,而是我们自己定义的target,所以在最外层的for循环当中要加上判断排序后第一位是否大于target的操作,其余剩下的操作与三数之后相同。原创 2023-04-15 17:42:25 · 50 阅读 · 0 评论 -
代码随想录之三数之和
a的降重的比较是 nums[i] == nums[i -1],为什么是 与i-1比较 而不是i+1比较,是因为i的下一个是left指针,二:本题另一个主要的点是,去重的思想,假设这三个数分别是 a ,b ,c,我们所求的是a+b+c=0;如过比较的是i+1,是比较i与left指针,比较的是数组中a与b的值不同,所以此处用的是i-1。b与c的判重是,排序之后的数组,如果大于0,就是right的值过大,所以是right–.思路:本题没有使用Hash表的解法,本题使用了数组+双指针的解法来完成。原创 2023-04-15 17:09:38 · 143 阅读 · 0 评论 -
代码随想录之四数相加||
思路:我们将四个数组两两一组,求出上面两个数组的和,将他们保存到map集合当中,和作为key,出现的次数来作为value来保存,再将下面的两个数组求和,每次求和后去map集合当中去看看有没有他们和的相反数,如果有,将出现的次数记录上,没有的话就继续向下执行。比如:nums1 与nums2 中有一个和是3,nums3与nums4中的和是-3,此时将nums3与nums4的和变为相反数,变为3,然后与集合中比较,获得3出现的次数。本题的解法是使用hash表的解法,个人认为本题较难思考。原创 2023-04-15 15:15:21 · 89 阅读 · 0 评论 -
代码随想录之两数之和
hash表解法,使用map来完成本题,将数组的value作为map集合当中的key,将数组的下标作为作为map集合的value,主要的目的是,map就是能在最快的时间内,去查找这个key是否在map集合当中。该解法不再解释,直接暴力就完事。原创 2023-04-15 11:17:37 · 94 阅读 · 0 评论 -
代码随想录之快乐数
使用hash表,利用Set集合,因为如果不是开心数的话,他会进入一个循环当中,这一轮数字会不断的重复出现,所以我们利用Set的不可重复性,来完成。思路是将一个数循环一百次,看看这100次当中是否能出现1,如果不能出现就不是快乐数。本题有一个难点是如何完成数的循环过程。该解法是笔者唯一能想出来的方法。原创 2023-04-15 10:24:09 · 69 阅读 · 0 评论 -
代码随想录之两个数组的交集
思路:因为比较两个数组中的相同元素,我们可以使用set来存储,去掉相同的元素之后,在利用这个集合来对第二个数组中的元素来进行对比。如果该数组中有与集合中相同的数时,将这个数组中的值添加到新的集合中。笔者认为,本题最重要的是集合转换为数组的方法。思路较简单,多练习即可。最后再将集合转变为数组。原创 2023-04-14 22:37:37 · 108 阅读 · 0 评论 -
代码随想录之有效字母异位词
使用数组方式来解决问题,使用数组的条件是,当hash的范围控时,如本题的hash大小为26,所以可以使用数组,同时数组中不用跟字母的ASCLL相对于,只要一个字母对应一个位置即可。该解法使用map来一一对应,主要思路是在力扣的解题方法中看到的。对字符串排序,然后比较是否相同,此处不再写。该题用的是hash表的解法。原创 2023-04-14 21:54:22 · 81 阅读 · 0 评论 -
代码随想录之环形链表||
双指针的方法:根据数学方法,我们可以知道,快指针从快慢指针相遇的结点出发,慢指针从头结点出发,每个指针每次向后移动一次,当两指针相遇的位置就是环的入口。具体的解法在代码随想录。使用hash表来完成。该解法借鉴的是力扣中的官方解法一。使用了哈希表的不可重复的特点,如果出现了相同的链表结点就说明出现了环。原创 2023-04-14 16:35:03 · 89 阅读 · 0 评论 -
代码随想录之链表相交
求出两个链表的差,将较长的链表的指向头指针的指针向后移动差值的次数,此时再将指向两个链表的指针同时向后移动,如果指针相同,就返回相应的位置。评论中对该解法的评论:走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。1.指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历。这是笔者能想到的最基本的思路,再结合代码随想录完成相应的代码。2.如果 pA 到了末尾,则 pA = headB 继续遍历。4.比较长的链表指针指向较短链表head时,长度差就消除了。原创 2023-04-13 11:48:29 · 169 阅读 · 0 评论 -
代码随想录之删除链表的倒数第N个结点
思路:笔者这种思路没有想到,参考答案后得知,因此作为参考。原创 2023-04-12 22:31:21 · 65 阅读 · 0 评论 -
代码随想录之两两交换链表中的结点
本题关键点是画图,把链表的图画出来的话会跟清晰,笔者在第一次写的时间没写出来是因为第一次没有考虑到第一与第二结点交换后如何指向第三个结点,没有想到提前创建一个指针指向第三个变量。直接能够判断出链表的奇偶了,当后面还剩下一个时,直接就跳出了循环。注意,每次的步骤结束后,看的是新的cur->next,这是关键所在。原创 2023-04-12 21:26:04 · 94 阅读 · 0 评论