自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后、37. 解数独

从给定的飞机票中,输出能使用全部飞机票的行程,如果存在多个行程,选择字母排序靠前的行程。:第一次做困难的题,这道题与之前最大的区别在于回溯函数有boolean的返回值,选择排序靠前行程在于先对目的地进行排序,最先找到的行程就是靠前的行程。最后还有一个用例没过,二刷再看吧,可以剪枝。JKKboolean。

2024-05-31 18:37:04 421

原创 代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、47.全排列 II

输出数组中的所有非递减子序列,数组中和序列中可能存在重复元素,但结果的序列集不能有重复的序列。:其实回溯的题很多都很相似啊,模版化有点重。本质就是无法确定需要套几层for循环,只能用回溯。这道题区别在于,因为要找原数组的非递减序列,所以不能改变原数组序列顺序,但仍要去重。去重的本质就是同一层一个数字只能访问一次,同一层的结点就是每个for循环,每个分支就是递归,所以只需要在for前标记单层的数字访问情况,即可去重。[-100,100]

2024-05-23 11:27:38 286

原创 代码随想录算法训练营第二十八天|93.复原IP地址、78.子集、90.子集II

为一串数字添加分割成有效的ip地址,输出所有的可能。:这个感觉和上一道回文串很像,就是判断回文串改为判断数字是否有效。不过还是有很多细节需要注意。定义函数用双指针判断字符串的范围数字是否有效,如果长度大于3则无效;如果子串以0开头,且不是单个0,视为无效的IP地址段;将字符转换为数字,如果在[0,255]则有效,否则无效。定义lists存储所有组合,定义path存储当前分割的数字。startidx为当前指向的字符。递归函数中如果当前path中数字大于四个则直接返回;

2024-05-19 21:23:54 920

原创 代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串

在无重复元素的candidates中找出所有和为target的组合,candidates中元素可重复使用。:感觉好几道组合总和都很相似,但都有细节差别。

2024-05-17 22:42:03 753

原创 代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

在1~9中找出个数为k的和为n的所有组合。:和上一次的回溯很像很像。:定义一个startIndex作为每次循环的起始位置,path为每个结果的路径,sum为当前路径的总和。进行操作时首先判断当前的sum是否大于n,如果大于n直接返回并回溯,然后判断当path元素个数为k且总和为n时,将path加入lists并返回。在path中加入元素,sum中加入当前元素,再进行递归,递归的startIndex加1即为加入当前元素后面的元素,保证path中不再重复。

2024-05-14 21:23:58 295

原创 代码随想录算法训练营第二十四天|77. 组合

求出1~n的所有k个组合。:因为之前做求出所有路径,那时候回溯理解了很久,现在看这个还算有点感觉。:定义一个startIndex作为每次循环的起始位置,path为每个结果的路径。在path中加入元素,再进行递归,递归的startIndex加1即为加入当前元素后面的元素,保证path中不再重复。递归完成后再移除上一步加入的元素。当path元素个数为k时,将path加入lists并返回。同时在进行for循环时考虑到剪枝,i最大只能为,当大于这个数时,结果不再成立。

2024-05-08 17:36:05 211

原创 代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

将二叉搜索树中结点值在一定范围内的保留下来,其余的进行删除,保证删除后仍为二叉搜索树。:感觉和二叉树删除很像很像,但还是有点困难,主要是递归该返回什么掌握不好。:先序遍历,如果当前结点小于low,当前结点的右子树可能仍存在区间范围内的结点,所以递归处理结点的右子树,后返回上一层;同理如果当前结点大于high,当前结点的左子树可能仍存在区间范围内的结点,所以递归处理结点的左子树,后返回上一层;如果当前节点满足区间范围,则处理左右子树,并连接到当前节点的左右孩子。

2024-05-08 09:40:47 252 1

原创 代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

找出二叉搜索树的最近公共祖先。:想了一会感觉是这么做的,结果也没啥问题。:先序遍历,返回最早出现的在两个结点数值之间的结点。

2024-05-05 18:13:35 290 2

原创 代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

求出二叉搜索树中两个元素的最小差值。:因为二叉搜索树中序遍历顺序从小到大,所以只需要在中序遍历中,每次求出前后两个元素差值,并在过程中保存最小的一个。:定义last用来记录上一个结点值,定义min作为最小的差值,对二叉树进行中序遍历,每次遍历计算当前节点值和上一个节点值的差值,更新最小差值,并更新上一个结点值。最后返回最小差值。

2024-05-04 20:54:17 398 1

原创 代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

每次将最大元素作为当前结点,并将最大元素的左右侧元素分别作为左右子树。:还是不需要创建新的数组,只需要创建左右指针。和前序中序构造树有点相似。:定义双指针分别指向数组头尾,找出双针内范围最大值。最为当前节点,然后递归遍历最大值左面的元素作为左子树,最大值右面的元素作为右子树,最后返回当前节点。

2024-05-01 11:47:17 250 1

原创 代码随想录算法训练营第十八天|513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

找出最下面一层元素最左面的元素值。:直接用队列层次遍历比较简单,递归较为复杂,和获得所有路径的题有点相似。然后层次遍历其实就是广度优先,递归就是深度优先。递归法哪种遍历都可以,毕竟哪种遍历都是先遍历左结点,再右结点。:队列存入每层元素。不断将队头元素值存入List,再将队头的左右节点再次存入List,最后推出队头。此时队列中为下一层元素,不断循环,记录每层的第一个元素。最终获得最后一层的第一个元素。

2024-04-29 22:29:48 786

原创 代码随想录算法训练营第十七天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

判断二叉树是否为平衡二叉树。:判读二叉树遍历方式为左右根,求高度遍历方式也为左右根。:如果当前节点为空或者为叶子结点,则返回true;如果不为空或者为叶子结点,则判断左右子树高度差十分大于1,大于一则直接返回fasle,小于一要判断左右子树收否都为平衡二叉树,如果不是则返回fasle。

2024-04-25 15:28:50 362 1

原创 代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

求出二叉树最大深度。:这道题深度和高度没有区别,因为前一天的层次遍历,很快想到了可以用层次遍历。然后学习的递归方法,感觉自己虽然写出来了,但是从来没有考虑过自己到底用的是什么遍历方法。:队列存入每层元素。不断将队头元素值存入List,再将队头的左右节点再次存入List,最后推出队头。此时队列中为下一层元素,不断循环,记录遍历层数,最后遍历完所有层元素。:当前节点的深度为左右节点深度较大值加1,遍历方式为左右根。

2024-04-23 18:40:51 305

原创 代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

对二叉树进行层次遍历,将每层节点val存入List,再将所有List存入一个List。:这个之前学数据结构学过,用到了队列。:队列存入每层元素。不断将队头元素值存入List,再将队头的左右节点再次存入List,最后推出队头。此时队列中为下一层元素,不断循环,最后遍历完所有层元素。

2024-04-21 20:01:25 284 1

原创 代码随想录算法训练营第十四天|144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历

对二叉树进行前序遍历。:这个原函数要返回一个List,所以遍历的时候不用原函数,而是新创建一个返回void的preorder函数。:不断先遍历跟节点,在分别递归遍历左右节点。:O(n):O(n)

2024-04-21 12:17:58 341 1

原创 代码随想录算法训练营第十三天|239. 滑动窗口最大值、347.前 K 个高频元素

求出长度为k的滑动窗口中最大的元素,并存入n-k+1长度的数组中。:暴力解法比较容易,但会超时。学习了单调队列的方法,主要是对deque不是很熟悉,depue双端队列,对队列的头first和尾last都可以进行加入删除查看值的操作,十分的方便。:创建一个双端队列作为单调队列,队列存储元素下标。单调队列保证队列从头到尾数字从大到小,不断遍历数组元素,并将下标放入队列。当队头元素超出滑动窗口范围时,直接出队,不断删除队尾比新加入元素小的元素,保证队列从头到尾数字从大到小,最后将每次的队头加入数组。

2024-04-20 14:51:28 380

原创 代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

不断遍历字符串,当其和栈顶元素相等,则出栈;不相等时,则将该元素入栈。同时在遍历时将字符串从后向前遍历,保证先出栈的元素是字符串前面的元素。:感觉今天栈的问题主要在于是否知道用栈来处理,一旦确认了用栈处理感觉就不难,但不知道遇到新题能不能想到用栈。:不断遍历数组,当元素是数字时,则推入栈;:不断遍历字符串,当其和栈顶能匹配时,则出栈;不能匹配时,则将该元素入栈。:感觉这道题就是典型的直到用栈就可以很轻松做出来的,不知道就会麻烦。:不断删除字符串中的所有相邻重复项,直到不存在相邻重复项为止。

2024-04-15 22:15:04 322 1

原创 代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈

用栈实现队列的初始化、push、pop、peek、empty。:当时学数据结构时候学过。:定义两个栈,分别为入栈和出栈。push时,直接将元素push到进入栈;pop时,如果出栈里面没有元素,则将入栈的所有元素推入出栈,此时栈顶则为最早进入的元素,可以pop元素,如果出栈中有元素,出栈栈顶的元素即为最先入栈的元素,直接pop元素;peek同理;empty即判断两个栈是否都为空。

2024-04-15 17:16:31 288 1

原创 代码随想录算法训练营第九天|232.用栈实现队列、225.用队列实现栈

将字符串数组反转并存在原数组中。:左右两个指针遍历遍历一遍。:将左右指针分别指向数组头和尾,不断将头尾字符交换,直到左右指针相等。:O(n):O(1)

2024-04-15 16:52:10 794 1

原创 代码随想录算法训练营第八天|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、51.翻转字符串里的单词、卡码网:55.右旋转字符串

将字符串数组反转并存在原数组中。:左右两个指针遍历遍历一遍。:将左右指针分别指向数组头和尾,不断将头尾字符交换,直到左右指针相等。:O(n):O(1)

2024-04-11 18:06:34 883 1

原创 代码随想录算法训练营第七天|454.四数相加II 、383. 赎金信 、15. 三数之和、18. 四数之和

在四个数组中各选出一个元素,使其加和为0,返回能满足的四元组个数。:我下面写的用到了两个map。但实际可以只用一个map,然后直接遍历数组即可。:将两个数组元素加和的所有可能存入map1作为key,加和key出现的次数作为value。再将剩下两个数组进行同样操作存入map2。遍历map1的value,查看map2是否存在-value,如果存在,则将两个对应的key相乘存入计数器count。

2024-04-09 22:39:25 764

原创 代码随想录算法训练营第六天|242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

判断两个字符串s和t里字母是不是种类个数相同,只是顺序不同。:之前没学过hashmap,看了视频学会了用数组表示,注意创建数组时默认值全为0;然后数字是直接可以直接-‘a’,这样代表了数字直接减去a的ascii码。:用数组的0~25分别存储s中小写字母a~z出现的次数,再减去t中小写字母出现次数,最后查看数组是否全为0。:O(n):O(1)

2024-04-08 23:18:12 804

原创 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

两两交换相邻的节点,当节点为奇数个时,最后的节点不动。:开始感觉很像昨天翻转链表用到的双指针方法,后来感觉其实没有那么麻烦,我看一些人还是用了递归的方法,二刷的时候再写。:对遍历节点的后两个结点进行交换操作,交换后遍历节点向后移动两位继续交换,直到交换完全部链表。:O(n):O(1)

2024-04-07 18:19:45 367

原创 代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表

移除链表值为val的元素。:看起来不难,实际上还是容易出错。leecode链表的题head本身就是内容有效的第一个节点,所以在移除时可以考虑在head前添加虚拟头节点dummy,同时还要考虑循环条件不要出错。:当head为空时,直接范围head;当head不为空时,创建一个虚拟头节点,依次遍历每个节点,当数字为val时,删除该节点。:O(n):O(1)

2024-04-07 00:27:45 322

原创 代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

将有序数组元素平方后从小到大排序,数组中可能存在负数。:最简单的想法应该是将每个数字依次平方,然后再进行排序。其次就是想到用双指针指向数组首尾依次选出平方最大的元素,不过开始想着是否可以把最大的数字平方直接存在原数组中:当右指针数字平方大的时候,右指针直接向左移动,当左指针数字平方大时,左右指针数字互换,右指针仍然左移。出问题的地方在于右指针数字平方可能比左指针右面数字平方还小,这样左右指针指向的就不是绝对值最大的两个数字了。

2024-04-05 20:39:50 276

原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

值得注意的是,我们要明确在每次循环中,要比较的元素范围是 [left,right] 还是 [left,right)。当为前者时,循环条件为 left <= right ,因为当 left = right 时,依然存在范围,且当 target < mid 时,我们要把right的值改变成 mid - 1,因为我们已经明确 target < mid 了,在双闭区间内时,不需要再次把mid这个元素添加到比较范围之中。数组中找到目标值target的下标,若不存在返回-1。空间复杂度 O(1)

2024-04-03 20:41:18 290

空空如也

空空如也

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

TA关注的人

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