算法练习题
干饭第一小能手
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
思路:遍历元素出现频率可以将相邻两个元素进行比较,输出出现频率最高的元素。用count存储当前元素出现频率,maxCount存储最大频率,二者进行比较。当count>maxCount的时候,更新maxCount并清空结果集result。思路:遍历过程中遇到p或q返回,对左子树和右子树进行递归操作。左与右的处理逻辑:左右都不为空返回根节点,左为空右不为空返回右节点,左不为空右为空返回左节点。思路:中序遍历,用pre节点记录cur节点的前一个节点的值。原创 2023-05-01 17:59:23 · 36 阅读 · 0 评论 -
代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
思路:递归函数参数传入存放元素的数组,数组下标左区间和右区间,返回根节点。终止条件数组大小为1,遍历到叶子节点。单层递归:找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来分割数组。原创 2023-04-27 17:04:15 · 40 阅读 · 0 评论 -
代码随想录算法训练营第十八天|513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树
思路:确定递归函数的参数和返回值,树的根节点和最大深度为参数,返回值void。当遇到叶子节点统计最大深度。递归过程中使用回溯。原创 2023-04-25 15:32:26 · 33 阅读 · 0 评论 -
代码随想录算法训练营第十七天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
思路:单层递归中的逻辑,先判断左右子树不是平衡二叉树的情况,再判断左右子树是平衡二叉树的情况。当任意节点左右孩子高度差>1时,不符合平衡二叉树条件,结果返回-1,往上一层层返回。(后序遍历)原创 2023-04-23 17:38:03 · 41 阅读 · 0 评论 -
代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
思路:递归法,采用后序遍历计算树的高度。先求左子树的深度,再求右子树的深度,最后取左右深度最大的数值再+1(中间节点) ,得到根节点的树的深度。原创 2023-04-21 21:11:27 · 36 阅读 · 0 评论 -
代码随想录算法训练营第十五天|层序遍历、226.翻转二叉树、101. 对称二叉树
左节点和右节点都为空 return true;左节点为空或右节点为空 return false;左节点的值不等于右节点的值 return false。向下一层遍历比较外层与内层是否相同,左节点的左孩子和右节点的右孩子比较;左节点的右孩子和右节点的左孩子比较。思路:定义队列,当根节点不为空,将第一个节点加入队列。定义新的数组,将一层节点放入该数组。遍历当前层元素,将队列弹出元素后存入数组,size--。思路:判断节点是否为null,交换节点的左孩子和右孩子,分别循环调用原函数向左向右遍历。原创 2023-04-19 23:52:34 · 33 阅读 · 0 评论 -
代码随想录算法训练营第十四天|递归遍历、迭代遍历、统一迭代
思路:1.确定递归函数的参数和返回值、2.确定终止条件、3.确定单层递归的逻辑。前序遍历是中左右、中序遍历是左中右、后序遍历是左右中。原创 2023-04-19 11:59:32 · 26 阅读 · 0 评论 -
代码随想录算法训练营第11天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
思路:遍历s字符串,将字符串s中字符存入ch中,通过匹配左括号将对应的右括号压入栈中。此时要分三种情况。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符,所以return false。第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。当字符串遍历完之后,栈是空的,return true。原创 2023-04-16 15:16:23 · 27 阅读 · 0 评论 -
代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈
思路:push操作直接把数据放入输入栈中,pop操作需要判断输出栈是否为空,如果输出栈为空就将输入栈中的数据全部存入输出栈中(输入栈不为空),再从栈中弹出数据。如果输出栈不为空,就直接从输出栈弹出数据。原创 2023-04-15 00:03:29 · 27 阅读 · 0 评论 -
代码随想录算法训练营第九天|28. 实现 strStr()、459.重复的子字符串
思路:1、计算needle每一位及之前的字符串中,前缀和后缀公共部分的最大长度的next数组;2、匹配needle和haystack,当needle失配时,利用next数组,实现needle的最大后移,从而避免不必要的匹配,减少匹配次数。next数组是needle每一位及之前的字符串中,前缀和后缀公共部分的最大长度的集合。当循环中i=s.length()-1时,若k指向字符串与i指向字符串不相等,k回到前缀的公共前缀处继续比较。原创 2023-04-14 00:21:52 · 29 阅读 · 0 评论 -
代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题.链表相交、142.环形链表II
1.判断链表是否有环:使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast==slow ,说明这个链表有环。思路:调用for循环使快指针移动n步后,快指针和慢指针同时移动,当快指针下一位指向null时,循环结束,通过slow.next = slow.next.next删除该节点,返回头结点。思路:设置临时节点,将cur节点下一位节点指向2节点,2节点下一位节点指向1节点,cur节点移动两位实现下一轮交换。原创 2023-04-08 23:33:11 · 46 阅读 · 1 评论 -
代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表
定义新指针cur指向头结点,while循环判断新指针cur不为null且cur指针指向的下一位不为null,当cur.next指向的值为输入值时,cur.next.next的地址赋值给cur.next实现删除操作。temp保存cur.next结点,通过cur.next = pre改变cur.next的指向,cur指针向后移动一位,pre指针也向后移动一位。定义当前结点前一个结点指针pre,当前结点指针cur和中转指针temp用于保存结点。1.直接在原链表上进行删除操作、2.设置虚拟头结点进行删除操作。原创 2023-04-07 23:40:34 · 37 阅读 · 1 评论 -
代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵Ⅱ
通过一个for循环对窗口的终止位置进行循环,采用while循环判断窗口值之和是否≥s。若成立,窗口进行移动。末位置通过for循环变动,起始位置通过i++来移动。指针指向较大值处,该值传入新定义的数组result,result长度为nums.length,指针向右或左移动一位。通过两个for循环,一个for循环循环数组初始位置,一个for循环循环数组末位置,从而实现区间的搜索。定义新数组arr,给数组赋值count,每条边遍历长度l,i和j。按非递减顺序排序的整数数组,定义双指针从数组左右两边开始比较大小。原创 2023-04-06 23:23:20 · 42 阅读 · 0 评论 -
代码随想录算法训练营第一天|704.二分查找、27.移除元素
1.target位于[left,right]区间中时,while(left<=right)中==可以取到;当target<nums[mid]时,target所在区间为[left,mid-1];target>nums[mid]时,target所在区间为[mid+1,right]。2.target位于[left,right)区间中时,while(left<right)中==不可以取到;当target<nums[mid]时,target所在区间为[left,mid);原创 2023-04-05 23:23:30 · 257 阅读 · 0 评论