![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
algorithm
文章平均质量分 50
efzy
这个作者很懒,什么都没留下…
展开
-
101.对称二叉树
*进阶:**你可以运用递归和迭代两种方法解决这个问题吗?给你一个二叉树的根节点。, 检查它是否轴对称。原创 2024-01-31 23:14:14 · 381 阅读 · 0 评论 -
100.相同的树
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。,编写一个函数来检验这两棵树是否相同。给你两棵二叉树的根节点。原创 2024-01-31 23:12:42 · 347 阅读 · 0 评论 -
94.二叉树的中序遍历
递归算法很简单,你可以通过迭代算法完成吗?给定一个二叉树的根节点。原创 2024-01-31 23:11:58 · 376 阅读 · 0 评论 -
88.合并两个有序数组
*注意:**最终,合并后数组不应由函数返回,而是存储在数组。**进阶:**你可以设计实现一个时间复杂度为。个元素表示应合并的元素,后。中,使合并后的数组同样按。的算法解决此问题吗?原创 2024-01-31 23:10:42 · 332 阅读 · 0 评论 -
70.爬楼梯
也就是f(n) 为以上两种情况之和,即f(n) = f(n - 1) + f(n - 2),从该公式可知,本题可采用斐波那契额数列,本题可转化为求斐波那契数列打的第n项,区别仅 在于初始值不同;青蛙的最后一步只有两种情况:跳上1级或跳上2级台阶。你有多少种不同的方法可以爬到楼顶呢?所以本题就转换为求斐波那契额数列第n项的和。原创 2024-01-24 00:08:58 · 400 阅读 · 0 评论 -
69.x 的平方根
很容易知道,题目要我们返回的整数是有范围的,一般上一个整数的平方根肯定不会超过它自己的一半,但是 0和 1除外,因此我们可以在 1到输入整数除以 2这个范围里查找我们要找的平方根整数。0单独判断一下就好。如果这个整数的平方 严格大于 输入整数,那么这个整数肯定不是我们要找的那个数;输入整数,那么这个整数 可能 是我们要找的那个数(重点理解这句话)。猜的数平方以后小了,可能猜的数就是,也可能不是。猜的数平方以后恰恰好等于输入的数就找到了;输入整数,那么我们就找到了这个整数;猜的数平方以后大了就往小了猜;原创 2024-01-22 00:25:26 · 384 阅读 · 0 评论 -
66.加一
如果等于9,设置该位置为0,再看十位位置,小于9,直接十位数字+1,直接返回。你可以假设除了整数 0 之外,这个整数不会以零开头。最高位数字存放在数组的首位, 数组中每个元素只存储。数组所表示的非负整数,在该数的基础上加一。如果没在①处返回,则表示数字最终会有进位。从个位数开始看,如果小于9,直接+1返回。如果等于9,设置该位置为0,以此类推。原创 2024-01-20 23:43:30 · 362 阅读 · 0 评论 -
42.接雨水
jLeftMax >= iLeftMax 这个不是显然吗,j左边的元素包含了i左边的所有元素,如果非要证明一下的话, 那么, iLeftMax = Math.max( height[0], height[1] …height[j - 1], height[j] ) ④, 由反证法可知 若 jLeftMax < iLeftMax , 则 ④式 不成立, 故 jLeftMax >= iLeftMax, 同理可得:iRigthMax >= jRightMax。的高度为 0,而这里最多能盛 2 格水,2-0=2。原创 2024-01-18 23:41:08 · 904 阅读 · 0 评论 -
38.外观数列
然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。一个数字字符串,首先要将字符串分割为。数量的组,每个组都由连续的最多。原创 2024-01-17 22:42:45 · 351 阅读 · 0 评论 -
36.有效的数独
遍历每一个位置,判断该位置数字在所在行row中是否出现过,或在所在列col中是否出现过,或者在3*3的小区域bucket中出现过,如果三者其一出现过,直接返回false。如果都没出现过,将该位置所在位置值都分别设置进row、col、bucket中,遍历下一个。上面两个数组什么意思呢?,验证已经填入的数字是否有效即可。原创 2024-01-16 23:37:19 · 381 阅读 · 0 评论 -
34.在排序数组中查找元素的第一个和最后一个位置
请你找出给定目标值在数组中的开始位置和结束位置。该题考察的是二分法,二分法求左右边界问题。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。原创 2024-01-15 22:36:49 · 433 阅读 · 0 评论 -
33.搜索旋转排序数组
我们可以在常规二分查找的时候查看当前 mid 为分割位置分割出来的两个部分 [l, mid] 和 [mid + 1, r] 哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能够根据有序的那部分判断出 target 在不在这个部分。拿示例来看,[0,1,2,4,5,6,7]分开以后数组变成了 [4, 5, 6,7] 和 [0, 1, 2] 两个部分,其中左边 [4, 5, 6,7] 这个部分的数组是有序的,其他也是如此。,则返回它的下标,否则返回。按升序排列,数组中的值。原创 2024-01-14 23:13:31 · 398 阅读 · 0 评论 -
23.合并 K 个升序链表
,你add()一个数,PriorityQueue会自动排序,poll()一个数,会返回堆中的最小值。首先:该题使用java的PriorityQueue数据结构(PriorityQueue实质就是。请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。原创 2024-01-13 23:36:18 · 432 阅读 · 0 评论 -
28.找出字符串中第一个匹配项的下标
字符串的第一个匹配项的下标(下标从 0 开始)。匹配失败:枚举原串的下一个「发起点」,重新尝试匹配。匹配成功:返回本次匹配的原串「发起点」。原创 2024-01-11 22:59:56 · 363 阅读 · 0 评论 -
26.删除有序数组中的重复项
思路: 使用一个指针done指向第一元素,从第二个元素依次判断,看是否等于done处的值,如果相等,再判断第三个元素是否相同,不相同,修改done后一个位置处(也就是++done)的值为第三个元素的值,依次类推…最终不重复的总个数为done + 1(因为done初始化为0,是从0开始的)** 删除重复出现的元素,使每个元素。如果所有断言都通过,那么您的题解将被。,返回删除后数组的新长度。原创 2024-01-10 23:58:05 · 358 阅读 · 0 评论 -
21.合并两个有序链表
当curl和cur2其中一个为null时,判断另一个链表的cur是不是为null,不为null直接pre拼上。当curl和cur2都不为null时判断两指针的大小,小的拼到pre的下一个节点上,并且指针向后移动一位。curl2指向另外一条链表的头结点,pre作为结果的收集,先指向head。新链表是通过拼接给定的两个链表的所有节点组成的。使用两个指针,curl1指向头小的链表(head)的下一个节点。思路:两个链表,如果其中一个为空,返回另一个。判断两个链表头节点谁的小,谁小就做头。原创 2024-01-09 18:34:23 · 399 阅读 · 0 评论 -
20.有效的括号
栈为空,则表示之前没有出现过该右括号相对用的左括号,直接返回false。栈不为空,弹出栈顶元素,如果和当前右括号不一样,则表示之前没有。遍历完之后查看栈是否为空,不为空也返回。,判断字符串是否有效。原创 2024-01-09 18:33:13 · 331 阅读 · 0 评论 -
19.删除链表的倒数第 N 个结点
L初始化位置为NULL,R初始位置为Head,之后R先移动n+1位,R移动n+1位置后,L来到Head位置,两指针同时移动,当R值为NULL时,L当前位置就是需要删除节点的前一个位置。此时只需要L.next = L.next.next即可。原链表总个数正好< 要删除节点n的个数。原链表总个数正好=要删除节点n的个数。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。原创 2024-01-08 20:13:13 · 400 阅读 · 0 评论 -
17.电话号码的字母组合
以上的遍历不难发现这就是树的前序遍历,实际上不管是前序遍历,还是中序遍历,亦或是后序遍历,都属于深度优先遍历。同理从 10 开始往上回溯到 6, 6 没有除 10 以外的子节点,再往上回溯,发现 3 有除 6 以外的子点 7,所以此时会遍历 7。我们从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9。从 7 往上回溯到 3, 1,发现 1 还有节点 4 未遍历,所以此时沿着 4, 8 进行遍历,这样就遍历完成了。原创 2024-01-07 12:39:36 · 415 阅读 · 1 评论 -
14.最长公共前缀
拿数组中第一个字符串"flower"转为字符数组,然后去和字符数组"flow"比较,从头比较两个字符数组到哪个位置不重合,并用变量index记录,与min取最小值(min用来统计最小下标位置,初始值为Integer.MAX_VALUE)然后接着拿flower字符数组去和字符数组"flight",从头比较两个字符数组到哪个位置不重合,更新index与min取最小值。最后取得的最小值就是最大公共前缀的位置的后一个位置,所有最后用strs[0].substring(0,min);原创 2024-01-06 14:38:30 · 327 阅读 · 1 评论 -
15.三数之和
首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[L] 和 nnums[R],计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集。如果 nums[i] == nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过。当 sum == 0 时,nums[L] ==[L+1] 则会导致结果重复,应该跳过,L++当 sum == 0时,nums == nums[R−1]则会导致结果重复,应该跳过,R−−。原创 2024-01-06 14:39:38 · 347 阅读 · 1 评论 -
13.罗马数字转整数
可以保留当前位的值,当遍历到下一位的时,对比保留值与遍历位的大小关系,再确定保留值为加还是减。最后一位做加法即可。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。也可以往后看多一位,对比当前位与后一位的大小关系,从而确定当前位是加还是减法。通常情况下,罗马数字中小的数字在大的数字的右边。也就是说把一个小值放在大值的左边,就是做减法,否则为加法。当小值在大值的左边,则减小值,如 IV=5-1=4;当小值在大值的右边,则加小值,如 VI=5+1=6;,即为两个并列的 1。原创 2024-01-05 12:48:59 · 339 阅读 · 1 评论 -
12.整数转罗马数字
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做。这些数字对用的罗马数字列出来,用StringBuilder拼接每个位置。根据上面提示可知,该整数不会超过4000。,即为两个并列的 1。给你一个整数,将其转为罗马数字。例如, 罗马数字 2 写做。原创 2024-01-05 12:48:24 · 355 阅读 · 1 评论 -
11.盛最多水的容器
解题思路:两指针i , j ,指向的水槽板高度分别为 h[i] , h[j] ,此状态下水槽面积为 S(i,j)。,水槽的短板 min(h[i],h[j])不变或变小,因此下个水槽的面积。,水槽的短板 min(h[i],h[j])可能变大,因此下个水槽的面积。首先弄清楚一点,有一个木桶效应也可称为短板效应,是讲。因此,在代码中想要求得最大值,选择移动短板。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。原创 2024-01-05 12:47:45 · 388 阅读 · 1 评论 -
7.整数反转
再来看最小值,-2的31次方的原码表示为10000000 00000000 00000000 00000000,此时最高位的数字既代表符号,也代表数值。res == m && x % 10 < n : 当在反转的过程中res == -214748364,但是x % 10 < 8 此时再反转肯定也会溢出int接受范围。因为int是带符号类型,所以最高位为符号位,于是最大表示的正数是:01111111 11111111 11111111 11111111,也就是2的31次方减1。中的数字部分反转后的结果。原创 2024-01-04 13:46:51 · 363 阅读 · 1 评论 -
5.最长回文子串
再以0和1(0 + 1)位置为起点,向两边扩,找到最大回文数;再以1和2(1 + 1)位置为起点,向两边扩,找到最大回文数;如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。以0位置为起点,向两边扩,找到最大回文字符串;以1位置为起点,向两边扩,找到最大回文字符串;思路:从头遍历字符串。记录最长的最大回文数。记录最长的最大回文数。原创 2024-01-03 12:12:15 · 354 阅读 · 1 评论 -
3.无重复字符的最长子串
思路:遍历字符串每个下标位置i,以i为结尾位置往左推,得到每个位置最长无重复子串,然后得到最大值即可。看代码思路不清晰,画个图就一目了然了。,请你找出其中不含有重复字符的。影响最长子串有两个关键位置。原创 2024-01-03 12:11:13 · 319 阅读 · 1 评论 -
2.两数相加
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。修改last = curL;原创 2024-01-03 12:09:56 · 352 阅读 · 1 评论 -
1.两数之和
思路:在Map中查找某个key的时间复杂度是O(1),挨个遍历整个数组的同时,判断Map中是否有满足条件的,如果没有,则加入到Map缓存中,整个过程时间复杂度为O(n)整数,并返回它们的数组下标。,请你在该数组中找出。原创 2024-01-03 11:39:20 · 345 阅读 · 1 评论