自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 算法训练Day25 | 216.组合总和III、17.电话号码的字母组合

【代码】算法训练Day25 | 216.组合总和III、17.电话号码的字母组合。

2023-06-03 11:25:43 82

原创 算法训练Day24 | 第77题. 组合

可以参考这个题解,写的是真好。剪枝过后:99.97%剪枝前:25.78%

2023-06-02 17:31:29 96

原创 算法训练Day23 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

【代码】算法训练Day23 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树。

2023-06-02 13:13:25 104

原创 算法训练Day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

【代码】算法训练Day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点。

2023-05-31 15:57:54 80

原创 算法训练Day21 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

【代码】算法训练Day21 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先。

2023-05-31 12:35:51 30

原创 算法训练Day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

【代码】算法训练Day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树。

2023-05-31 10:45:04 46

原创 算法训练Day18 | 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树

【代码】算法训练Day18 | 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树。

2023-05-28 14:06:25 31

原创 算法训练Day17 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

【代码】算法训练Day17 | 110.平衡二叉树、257. 二叉树的所有路径。

2023-05-26 10:10:44 137

原创 算法训练Day16 | 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

个人认为还是递归法好一点。完全二叉树的方法不太能理解。

2023-05-25 16:21:59 34

原创 算法训练Day15 | 226.翻转二叉树、101. 对称二叉树

这道题又帮忙复习了一下二叉树的递归:前序、后序、中序。同时用层序遍历也可以。

2023-05-25 11:48:21 38

原创 算法训练Day15 | 102. 二叉树的层序遍历及其各种拓展

在这里我想使用一下第二种方法,所以原先的List就用不了了,可以用Linkelist。创建一个队列,保存存进去的结点,每次记录队列大小,来进行循环出结点,放下一层结点。就是当每一层循环到i == size -1 时。第二种思路就是仍然循环插入,但是每次直接把list插在头部就行了。当遍历到某一层的最后一个结点,就把它的值取出来放进result。N叉数层序遍历,子节点集合list遍历一个一个放入deque。第一种思路就是按照原来的顺序,最后再把结果翻转即可。二叉树层序遍历,左右结点放进deque。

2023-05-24 23:17:59 65

原创 算法训练Day14 | 二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定单层递归的逻辑: 确定每一层递归需要处理的信息。每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!有点难,还真想不出来。

2023-05-23 14:54:19 37

原创 算法训练Day13 | 239. 滑动窗口最大值、347. 前 K 个高频元素

那么问题来了,定义一个大小为k的大顶堆,在每次移动更新大顶堆的时候,每次弹出都把最大的元素弹出去了,那么怎么保留下来前K个高频元素呢。所以我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。遍历hashmap,将元素放进去,挤出来,最后遍历完留下的就是前K个元素。若队列尾的元素小于当前遍历到的数组元素值,则不断将队尾元素移除。有的同学一想,题目要求前 K 个高频元素,那么果断用大顶堆啊。此时要思考一下,是使用小顶堆呢,还是大顶堆?

2023-05-22 22:00:06 119

原创 算法训练Day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

遍历完之后,要知道是否有多余的括号,则判断一下栈是否为空,若为空,则true。(等同于左括号太多了的情况)若遍历中,发现栈里已经没有元素了,自然就不能再出栈,也返回false。(其实等同于右括号太多了的情况)若碰到的是右括号,若右括号和栈顶元素括号不相等,则直接返回false;遍历整个字符串,若碰到任意一个左括号,则将对应的右括号放入栈中。若碰到右括号,且右括号与栈顶元素相互匹配,则将栈顶元素出栈。数字就放入栈,符号就从栈中取数字进行运算。但是这样好像复杂度不太行,需要改进。放入栈,跟上一题思路相似。

2023-05-21 11:17:06 48 1

原创 算法训练Day10 | 232. 用栈实现队列、225. 用队列实现栈

若要出队列,可以将入栈的元素全部放入出栈,然后返回出栈的pop()。记住在这之前要判断出栈是否有元素,如果有的话,直接返回出栈的pop,而不需要把入栈元素全部放入出栈中。用一个Queue实现,要入队列的时候,就把之前队列中的元素重新放回队列。是否为空则要看入栈和出栈是否都空。若要进队列,直接进入栈即可。

2023-05-20 11:34:25 87

原创 算法训练Day09 | 28. 找出字符串中第一个匹配项的下标、459. 重复的子字符串(待更新)

今日这两题是KMP经典题目。KMP主要应用在字符串匹配上。KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。

2023-05-20 10:12:36 79 1

原创 算法训练Day08 | 344. 反转字符串、541. 反转字符串 II、剑指Offer 05.替换空格、151. 反转字符串中的单词、剑指 Offer 58 - II. 左旋转字符串

主函数中for循环 i += 2*k ,判断剩余长度大小,执行不同区间的reverse。但是空间复杂度可能比较高喔,没有达到原地反转。先将后面的字符加入。再将前面的字符加入。但是好像复杂度不太行,需要改进。自定义一个函数reverse,实现对字符数组任意区间的字符进行反转。但是这里有个问题是,如果字符串s中间有两个空格,应该怎么办。用StringBuilder更改字符串,append添加。2.用split(" ")将字符串分为字符串数组。没什么好说的,左右指针往中间走就行了。3.反转字符串数组。

2023-05-17 17:48:59 61

原创 算法训练Day07 | 454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和

1.一些同学可能想,用数组干啥,都用map完事了,其实在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!时间复杂度为:O(n)+O(n^3),得到 O(n^3).时间复杂度为:O(n^3)+O(n),得到 O(n^3).2.遍历的顺序需要想清楚,先遍历更大更长的magzine,再遍历小的ransomNote,通过看数组的元素是否有小于零的来判断是否满足。(3). HashMap存两个数组之和,如AB。然后计算两个数组之和,如 CD。

2023-05-16 10:45:25 97 1

原创 算法训练Day06 | 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

我自己想到的方法是,用HashMap,先遍历第一个字符串,字符存在key,个数存在value。然后遍历第二个字符串,每来一个字符,就把对应的value减一。如果最后个数小于0的话,就返回false。当然,在程序最开始的地方需要判断两个字符串长度是否相等,如果不相等,直接返回false。第二种方法:直接用长度为26的数组保存字母个数,每个字符对应的位置为s.charAt(i) - ‘a’。也是在最后判断数组里的元素值是否为零。主要是要了解怎么得到每一位数的平方和。

2023-05-15 22:58:20 32 1

原创 算法训练Day04 | 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、142. 环形链表 II

这里需要操作的结点数很多,数四个分别为 cur、firstNode、secondNode、temp,判断循环结束的条件需要注意一下,避免出现空指针异常。可以先找到相遇点位置,让一个指针从头结点开始走,另一个指针从相遇点开始走,最后一定相遇,且相遇的地方就是环入口。当右指针遍历到链表尾部的时候,左指针就正好是要删除的结点的前一个结点,然后再删除即可。第二个方法:倒数第n个结点,可以从头节点开始,找到一个大小为n的窗口,也就是双指针。这里采用快慢指针的思路,满指针走一步,快指针走两步,看是否会相遇。

2023-05-13 10:02:33 95

原创 算法训练Day03 | 203.移除链表元素、707.设计链表、206. 反转链表

3.因此,为了想让链表移除结点操作逻辑统一,则可以加上一个虚拟头结点,也就是让虚拟头结点dummyhead的 next 指向头结点head。那么这样的话,移除头结点也只需要将虚拟头结点指向头结点的下一个结点就行了,逻辑得到统一。4.而且,一般链表类题目的返回值是链表的头结点,题目中难以去额外保存一个头结点。此处我设计的是单链表。1.移除中间结点:让上一个结点next指向下一个结点。不要去新建一个链表,而只需要在原来的链表上操作。2.移除头结点,则直接让头结点后移即可。

2023-05-12 15:10:40 30

原创 算法训练Day02 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

主要方法:1.暴力解法2.二分法3.双指针法(快慢指针,左右相向指针)4.滑动窗口(类似双指针):滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)窗口内是什么?答:窗口内是子数组元素如何移动窗口的起始位置?答:当结束位置确定,起始位置依照条件开始右移,也就是缩小窗口如何移动窗口的结束位置?答:窗口的结束位置是遍历的指针,for循环的索引。

2023-05-11 10:31:13 193 1

原创 算法训练Day01 | 704.二分查找、27.移除元素

遍历快指针fastIndex,若不是移除元素,慢指针slowIndex跟着一起移动,并复制到新数组元素;思路:比较数组中间位置的值nums[middle]和目标值target的大小,从而确定查找的左右区间。当左指针碰到移除元素时,把右指针元素放到左指针位置上,并且右指针左移,减小长度。个人习惯用左闭右闭的形式[left,right],循环条件是left

2023-05-10 09:53:59 289

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除