自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 海智算法训练营第三十五天 | 第八章 贪心算法 part05 | ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

力扣题目链接和射气球一样的做法,经典重叠区间基础问题力扣题目链接这道题也很好想,先记录每个字母对应的最远的下标,然后每次循环不断更新右边界,直到循环到i等于右边界的时候就找到了一个边界,放入res集合就好了。力扣题目链接这道题也很好理解,相当于前两题的结合体,这里多用了一个left指针来记录最左边界注意点:用此方法最后会有个left、right组合没有添加,要记得添加。

2024-02-28 21:20:46 747

原创 海智算法训练营第三十四天 | 第八章 贪心算法 part04 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

力扣题目链接这道题较简单,就是分清情况区别对待就ok了所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。 力扣题目链接遇到两个维度的问题的时候一定要先确定一个维度再确定另外一个维度按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高!那么只需要按照k为下标重新插入队列就可以了,为什么呢?看图:先以身高维度排序,再按照题目位置条件调整位置,因为排序后的前面比你高的数

2024-02-27 21:05:09 831

原创 海智算法训练营第三十三天 | 第八章 贪心算法 part03 | ● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

今日任务:1.k次取反后最大化数组和2.贪心解决加油站问题3.左右边界分别处理——分发糖果。

2024-02-26 23:19:41 837

原创 海智算法训练营第三十一天 | 第八章 贪心算法 part02 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

力扣题目链接这道题可以用贪心很简单的做出来,从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。所以代码实现起来也非常的简单力扣题目链接贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。力扣题目链接这道跳跃II的问题和跳跃I的问题区别就在于前者是寻找最短的跳跃次数,而解题的关键

2024-02-26 21:38:59 1185

原创 海智算法训练营第三十天 | 第七章 回溯算法part06 + 第八章 贪心算法01 | ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独 ● 总结

力扣题目链接比较好理解,画图出来根据树状图进行每行的处理力扣题目链接这道题和N皇后的区别就在于它是二维递归,也比较好理解

2024-02-25 01:56:28 635

原创 海智算法训练营第二十九天 | 第七章 回溯算法part05 | * 491.递增子序列* 46.全排列* 47.全排列 II

题目:非递减子序列原理:这道题不能用之前那种去重的方法,因为那些需要有序,这样只需要比较前后两个的值是否相同,而这道题不能使用排序,因为题目的要求是以当前序列的顺序找出他的非递减子序列。例如:所以,我们引用了set集合来充当uset数组来记录是否使用过这个数,也能达到理想的效果。注意点:结束递归的出口是当path的长度大于等于二的时候,因为序列要求至少有两个数 题目:全排列做法:这里我和题解不同的地方是我用的是hash集合来去重,感觉代码比较简单就没有看视频学习了。题目:全排列II

2024-02-23 23:25:30 566

原创 海智算法训练营第二十八天 |第七章 回溯算法part04 | ● 93.复原IP地址 ● 78.子集 ● 90.子集II

题目:复原ip地址原理:这道题的解法就是和分割回文串差不多的,可以简化成一个树形图像每次切割完后判断切出来的是否合法,合法的话就添加'.'加入之中,所以我们判断结束的条件就是当‘.’有三个的时候,这时候判断最后一个字串是否合法,如果合法就加入结果集。注意点: dfs(s,i+2,dot+1);这里i是+2.因为这时候已经添加了符号进去,所以这时候的串的长度和位置变化了。题目:子集I原理:这道题就是回溯的模板题,跟之前的题相比的特别之处是他需要收集所有的节点。题目:子集II原理:这道题用到了2的模

2024-02-22 23:28:57 644

原创 海智算法训练营第二十七天 | 第七章 回溯算法part03 | ● 39. 组合总和● 40.组合总和II● 131.分割回文串

组合总和这道题和组合总和III差不多,区别就在与可以在集合中取相同的数并且没有限制长度,只需要达到目标值就可以,难度就在于剪枝能否可以想到,if(sum + candidates[i] > target) break;组合总和II原理:通过一个判断是否查询过的数组来剪枝1.先将数组排序,便于去重2.创建一个used数组记录当前数组下标有没有被使用过3.if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) {

2024-02-22 22:07:20 1033

原创 海智算法训练营第二十六天 | 第七章 回溯算法part02 | ● 216.组合总和III● 17.电话号码的字母组合

题目:组合总和III此题和组合总和II的题很像,只是在它的基础上加了计算总和,所以只需要在原先的基础上增加终止条件就好了。终止条件:1.当当前的值相加大于目标值2.当前path的长度和k相等时判断当前值是否与目标值相等题目:电话号码的字母组合这道题较好理解,比较关键的地方就是数字映射相应的字母。

2024-02-21 16:16:47 447

原创 海智算法训练营第二十五天 | 第七章 回溯算法part01 | ● 理论基础 ● 77. 组合

题目:组合做法优点:当需要排列50个数的时候,套循环不可能套这么多,这时候用到递归。易错点:在回溯的过程中: dfs(n,k-1,i+1);我写成了 dfs(n,k--,i++);这是大错误,我debug了半天才发现,如果用下面这种写法不能达到回溯的效果,因为虽然传入的数字是对的,但是改变了原有k,i的值,导致后续的取值错误。原理:在1的基础上对i的取值范围进行缩少,对时间空间的占用较少

2024-02-18 01:04:50 520

原创 海智算法训练营第二十四天 | 第六章 二叉树part09 | ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇

题目:修剪二叉搜索树题目解释:此题是根据区间修剪二叉树,如果超出区间的节点就要将其删除做法原理:此题与删除节点的题做法类似,如果要删除节点,则把节点的孩子返回给上一个节点就可以了,此题二叉搜索树,如果当前节点的值小于区间最小值,那么就返回他的右孩子,因为右孩子要比当前节点更大,左节点的做法类似。题目:有序数组转化二叉搜索树原理:此题的关键就在于选择怎样的区间,我这里选取的是左闭右闭的区间,所以做判断的时候左右区间是可以相等的,相等的时候就是答案的赋值。题目:二叉搜索树转化累加树题意:比当前节点值

2024-02-17 00:06:27 550

原创 海智算法训练营第二十三天 | 第六章 二叉树part08 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

1.二叉搜索树的最近公共祖先2.二叉搜索树中的插入操作3.删除搜索二叉树中的节点。

2024-02-06 11:01:29 714

原创 海智算法训练营第二十一天 | 第六章 二叉树part07 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

今日任务:1 .二叉搜索树的最小绝对值2.二叉搜索树中的众数3.二叉树的最近公共祖先。

2024-02-04 14:24:06 570 1

原创 海智算法训练营第二十天 | 第六章 二叉树part06 | ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

题目:构建最大二叉树此题使用前序遍历,我这里和模板不一样的地方是我这里是左闭右闭。 题目:合并二叉树这道题易理解,用前后中序遍历都可以,因为只需要处理当前节点的节点,而不用用到父子节点,所以先遍历谁都可以。题目:二叉树搜索思路:明白了二叉搜索树的原理做这种题就会比较简单:二叉搜索树是一个有序树:递归法:迭代法:思想一样,从上往下遍历题目:验证搜索二叉树碰到搜索二叉树的题首先要想到的是中序遍历,因为搜索二叉树中序遍历输出出来的结果一定是有序的。易错点:这道题一开始我是遍历每个点,判断他

2024-02-03 00:53:03 603 1

原创 海智算法训练营第十九天 | 第六章 二叉树part05 | 513.找树左下角的值● 112. 路径总和 113.路径总和ii

1.用递归找树左下角的值2.路径总和。

2024-02-02 01:28:49 417

原创 海智算法训练营第十八天 | 第六章二叉树 part03 | 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

1.递归求平衡二叉树2.递归法求二叉树的所有路径3.左叶子之和。

2024-02-01 11:26:33 458 1

原创 海智算法训练营第十七天 | 第六章二叉树 part03 | 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

1.熟悉使用递归求二叉树的最大和最小深度2.学习完全二叉树求节点个数的特殊求法。

2024-01-31 01:52:32 633

原创 海智算法训练营第十六天 | 第六章二叉树part02.2 | 226.翻转二叉树 101. 对称二叉树

题目:翻转二叉树思路:交换每个节点的左右孩子1.递归法:只能用前序或者后序遍历二叉树,因为如果使用中序,中途会将左右孩子互换,会把某些节点的左右孩子翻转了两次。2.bfs层序遍历法层序遍历也是一样的思路,代码较简单题目:对称二叉树1.递归法:使用了后序遍历,为什么呢,因为要返回到根节点再比较,这样说比较难理解,如果看代码就好理解了,dfs找到了最底下的进行判断,然后返回答案上来,如果判断外侧和内测是否都为true的那串“中代码”放在前面或者中间都会影响答案。2.双端队列思路是一样的,弹出队

2024-01-30 00:50:09 625 1

原创 海智算法训练营第十四天 | 第六章二叉树part02 | BFS层序遍历十道题

因为比较好理解,所以直接做题,下面都是对应题的代码。 这个题最简单也是最模板的2..二叉树的层次遍历II 加个翻转就可以了3.二叉树的右视图4.二叉树的层平均值5.N叉树的层序遍历6.在每个树行中找最大值 7.填充每个节点的下一个右侧节点指针 8.填充每个节点的下一个右侧节点指针II 和上题没区别的,疑惑子9.二叉树的最大深度 10.二叉树的最小深度

2024-01-27 17:40:04 564 1

原创 海智算法训练营第十三天 | 第六章 二叉树part01 | ● 理论基础● 递归遍历 ● 迭代遍历● 统一迭代

int val;二叉树的定义和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。

2024-01-26 23:53:23 844 1

原创 海智算法训练营第十二天 | 第五章 栈与队列part03 | 239. 滑动窗口最大值 347.前 K 个高频元素

1.括号匹配:碰到左括号,将其右括号放入栈中,碰到相同的就弹出。2.字符串去重问题:把字符串顺序放到一个栈中,然后如果相同的话栈就弹出。3.逆波兰表达式问题:后缀表达式,也就是相邻处理的问题。4.滑动窗口最大值问题:自己设计队列,队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。5.求前 K 个高频元素:使用优先级队列最后,当遇到相邻问题的时候多思考栈和队列,会有大用处!

2024-01-24 22:50:49 607

原创 海智算法训练营第十一天 | 第五章 栈与队列part02 | 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

题目:有效的括号 这道题主要考察的是对栈的理解,这道题的思路是: 从左到右遍历字符串,遇到是左括号的就将他的右括号放入栈中,遇到右括号就弹出括号,如果弹出的括号匹配不上,那么就是无效的括号。题目:删除字符串中的所有相邻重复项用字符串模拟栈题目:逆波兰表达式求值这道题用到了栈的性质,因为后缀表达式的求法是遇到数字就加入栈中,遇到计算符就弹出前两个数进行计算,算出来的结果就再放进栈中,最后栈中的那个数就是答案。这里耍小聪明把一堆if换成了switch,好像并没有美观多少。

2024-01-23 19:52:48 573

原创 海智算法训练营第十天 | 第五章 栈与队列part01 | 232用栈实现队列 225 用队列实现栈

1.用栈实现队列2.用队列实现栈。

2024-01-22 21:34:48 560

原创 海智算法训练营第八天 | 第四章 字符串part02 | KMP算法 字符串章节总结 双指针回顾

代码随想录字符串总结篇1.反转字符串使用双指针法,定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。时间复杂度是O(n)。只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。使用快慢指针(双指针法),分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。4.移动窗口。

2024-01-20 20:52:20 582

原创 海智算法训练营第七天 | 第四章 字符串part01 | 344反转字符串 541反转字符串II 卡码网:54替换数字 151翻转字符串里的单词 卡码网:55右旋转字符串

题目:反转字符串创建两个指针分别从字符数组两端向中间遍历交换,这里用了异或交换,字符交换用异或比较合适,但如果碰到了数据较大的float类型的整形数字,就不能随便用异或交换了,还是老老实实创建变量吧。题目:反转字符串2第一种自己写的方法:我首先定义了两个指针作为移动窗口的区间,他们的差值是2k,定义循环的次数是数组的长度除于2k,每次循环两个指针都+2k,然后每次在这个区间里面切割字符串并反转,定义res字符串每次处理完区间内的字符串就加进去。自己写的方法非常麻烦,并且很容易就乱,在看了答案的处

2024-01-20 02:49:07 571

原创 海智算法训练营第六天 | 第三章 哈希表part02 | 1两数之和 454四数相加II 15. 三数之和 18四数之和

题目:两数之和这道题用map集合主要是因为有两个原因:1.有两个值需要判断,这时候map集合天然的优势,key—value键值对,key存储元素的值,value存储元素的下标。 2.数组长度不确定,而用哈希表数组的解法可能会浪费内存空间。解法:先将数组的元素值和下标通过循环逐一加入map集合中,同时在加入时判断map集合内是否有与其配对的target,如果有,就结束循环,并返回两个值的下标,map集合的下标就用map.get(key)方法求得。题目:四数相加这道题因为仅仅只有四个数组,所以解法较

2024-01-19 00:56:10 520 1

原创 海智算法训练营第五天 | 第三章 哈希表part01 | 242有效的字母异位词 349两个数组的交集 202快乐数 383赎金信

题目:有效的字母异位词在没细细了解哈希表的概念之前,这道题的算法我以为只是一个基础算法,没想到涉及了哈希表,属于哈希表中的数组,特点是ascii码连续且长度有限制。这道题解法简单,数组先记录s字符串出现几次位置+几个,然后记录t字串出现几次位置-几个。位置上都是0就是刚好抵消。Set集合的优点在于查找字符编码杂乱,并且数据跨度大的数据的内存空间不会浪费大,但是相比数组的查询速度会慢一些,特别是如果题目没有限制数据的长度的话,相对数组用Set集合会更好,但这道题限制了数据,可以用哈希表数组解法,但是上一

2024-01-17 20:57:20 480

原创 海智算法训练营第四天 | 第二章 链表part02 | 24两两交换链表中的节点 19删除链表的倒数第N个节点 面试题02.07.链表相交 142环形链表ll

两两交换链表中相邻节点,需要设置虚拟头节点dummyhead,用这张图做类比,因为先让dummyhead指向2节点,再让2节点指向1节点,这时候需要将1节点和3节点用temp保存下来,因为当dummyhead指向2节点的时候1节点就丢失了,同理,当2节点指向1节点的时候3节点也丢失了,所以需要保存这两个位置上的节点。题目:两两交换链表中的节点代码如下:此题的技巧就是通过两个指针,当快指针指向n位置的时候,将快慢指针同时往后移,当块指针指向null的时候慢指针也就指向了倒数第n个数,但在这里要注意先让

2024-01-16 21:36:32 1625 1

原创 海智算法训练营第三天 | 第二章 链表part01 | 链表相关:203移除链表元素 707设计链表 206反转链表

链表与数组的区别在于数组的内存是连续的而链表不是,链表是将散乱的内存地址通过指针串联到一起,并且寻找元素的时候只能从头到尾寻找,但是改变元素只需要O(1)的复杂度。这里主要写的是利用虚拟头节点来移除元素,如果不用虚拟头节点的话就需要进行两步,一步是处理头节点,另一步是处理非头节点,这两步的步骤不同,那么有什么好方法可以将他们合在一起呢?那就是使用虚拟头节点,虚拟头节点用于将原本的头节点也变成非头节点,这样他们的处理方式就一样了,代码如下:题目:移除链表元素注意的点:1.需要判断cur和cur.next

2024-01-15 21:47:41 520

原创 海智算法训练营第二天 | 第一章 数组part02 | 977有序数组的平方 209长度最小的子数组 59螺旋矩阵II(对撞指针、移动窗口、螺旋矩阵赋值)

暴力解法就不细琐了,就是用一个循环将数组内所有的数进行平方,最后再进行排序。这样的算法时间复杂度是O(n+logn)主要使用的是对撞指针(双指针)的解法:头指针从头开始,尾指针从数组的末尾开始,设置一个index下标指针用于给新数组赋值,因为有序数组平方之后最大的肯定是数组两边的数字,所以只需要对比两个指针的大小就可以有序将新数组赋值了:题目:有序数组的平方暴力解法就不说了,用两个for循环从头到尾遍历一遍,时间复杂度为O(n^2)这里用的是移动窗口算法,此算法的精髓就是移动窗口的始末位置,结束位置不

2024-01-14 22:49:35 444

原创 海智算法训练营第一天 | 第一章 数组part01 | 704.二分查找,27.移除元素

学习中发现了网上有许多二分模板,再初步学习后发现只需要背下其中一个万能的模板就行了万能模板:①先定义左闭右闭区间 (l,r) ②定义中间值mid ③通过判断语句判断mid值在结果的左边或者右边,进行l = mid+1或者r = mid -1缩短区间的操作④左区间大于右区间时停止循环,答案为 l+1在代码中,我改进了左闭右闭区间的代码,使其更简洁(好记)。原来的代码是l = mid,return mid,改成了l = mid+1,r = mid-1的形式更好记。题目:704 二分查找代码:题目

2024-01-13 20:58:02 460 1

空空如也

空空如也

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

TA关注的人

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