自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第二十九天【回溯】| 491,46,47

因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。树层去重(yes),树枝去重(no)子集问题结果在结点(个数>=2)排列问题不用startindex。排列用startindex。不用startindex。树枝不去重,树层去重。

2024-06-12 01:39:45 270

原创 代码随想录算法训练营第二十八天【回溯】| 93, 78, 90

和palindrome那道题极度相似模拟切割过程 = 组合问题里取数字串合法性判断: [startIndex, i]合法以后再加".",在进行下一步递归回溯。

2024-04-22 19:47:39 219

原创 代码随想录算法训练营第二十七天【回溯】|39,40,131

用used来标记,如果前后两个元素相等且前面一个元素没用过,就可以剪枝。去重:树层去重(yes)和树枝去重 (no)从startindex到i是被切割的子串。startIndex是切割线。

2024-04-07 20:55:11 334 1

原创 代码随想录算法训练营第二十五天【回溯】|216,17

注意backtracking传入的参数,数组和index, for loop是针对数组里的每一个数字。

2024-03-20 06:04:29 243

原创 代码随想录算法训练营第二十四天【回溯】|77

回溯:递归函数(回溯和递归是相辅相成的)本质是暴力搜索可应用场景:组合,切割,子集,排列,棋盘。因为回溯法解决的都是在集合中递归查找子集,。递归要有终止条件,所以必然是一棵高度有限的树(N叉树)。回溯三部曲。

2024-03-10 06:38:29 346 1

原创 代码随想录算法训练营第二十三天【二叉树】|669,108,538

在上图中我们发现节点0并不符合区间要求,那么将节点0的右子树直接赋给节点7的左孩子就可以了(就是把节点0从二叉树中移除),然后0的右子树再根据修建规则修建(比如还需修掉1:此时1有孩子为null,直接返回到2,删除1)如果要分割的数组长度为偶数的时候,中间元素为两个,是取左边元素就是树1,取右边元素就是树2。有序数组构造二叉搜索树,分割点就是数组中间位置的节点。如果根据数组构造一棵二叉树。bst实际就是有序数组,

2024-03-01 10:42:09 299

原创 代码随想录算法训练营第二十二天【二叉树】|235,701,450

第五种情况:左右孩子节点都不为空,则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置并返回删除节点右孩子为新的根节点。第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点。第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点。第一种情况:没找到删除的节点,遍历到空节点直接返回了。

2024-02-24 21:49:50 326

原创 代码随想录算法训练营第二十一天【二叉树】|530,501,236

然后同时有个result数组实时更新有maxcount的val。只要有count>maxcount就清空数组加入新val。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。因为是二叉搜索树,所以中序遍历就是有序的,然后就用双指针法,只要前后pre和cur相等就count+1。回溯:用后序遍历(左右中里的中在回溯,因为中的逻辑要根据左右的值来判断),且从下往上处理一定要用后序遍历。用双指针法,pre总在cur前一位。便利一遍就可以统计出来。

2024-02-21 06:24:25 347

原创 代码随想录算法训练营第二十天【二叉树】|654,617,700,98

构造二叉树:前序遍历:中左右(先构建中节点)前序遍历且此处指在root1的基础上修改递归终止条件: 但凡有一个节点为空, 就立刻返回另外一个. 如果另外一个也为None就直接返回None;这个递归终止条件保证了代码执行到单层递归逻辑这里root1, root2都非空。

2024-02-19 19:55:26 390 1

原创 代码随想录算法训练营第十八天【二叉树】|513,112,106

用层序遍历( 迭代法)回溯向下遍历时从target sum里减去此处的值,如果到叶子节点时计数为0,则返回true,如果孩子返回true,父节点也返回true。

2024-02-14 06:30:06 341 1

原创 代码随想录算法训练营第十七天【二叉树】|110,257,404

此处代码用后序遍历,只要有一个节点不是平衡就返回-1,之后所有上层节点都是-1。要用前序遍历(中左右):要让parent node指向child node。中要写到终止条件(判断叶子节点)前,不然叶子节点就放不进去了。左孩子不为null,但左孩子的左右孩子为null。求深度:前序遍历 ,从上往下,不需要返回结果。是否平衡:每个节点的左右子树高度差小于1。求高度:后序遍历,从下往上,层层往上返回。

2024-02-13 05:06:48 343 1

原创 代码随想录算法训练营第十六天【二叉树】|104,111,222

如果这个节点两侧深度一样,number of nodes=2^depth -1。写递归时有两个终止条件,1.reach null;2.左右两边深度相等。此代码为后序遍历,没有用完全二叉树的特性。用完全二叉树的特性可以少遍历几个节点。求高度:后序遍历(从下往上计数)根结点的高度就是二叉树的最大深度。最小深度:根结点到最近叶子的距离。可以层序递归/前中后。

2024-02-13 03:45:32 307 1

原创 代码随想录算法训练营第十五天【二叉树】|102,226,101

queue:先进后出,广度优先遍历,层序遍历stack:先进后出,深度优先遍历,递归遍历思路是用queue,pop元素时push他的左右child,用size记录queue的长度,每次pop size个元素(一层)

2024-02-08 00:17:01 325

原创 代码随想录算法训练营第十四天【二叉树】|144,94, 145

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。在这里也就会重复调用自己来实现递归的过程。前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值。如果当前遍历的这个节点是空,就直接return。

2024-01-28 01:45:11 381

原创 代码随想录算法训练营第十三天【栈与队列】|239,347

具体操作:heappushheappop ->pop最小值,min-heap,留下的都是大的。

2024-01-22 17:49:28 935 1

原创 代码随想录算法训练营第十一天【栈与队列】|20,1047,150

要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。放入stack,一遇相同元素就pop -> 相邻字符的消除。3.剪枝:奇数一定不符合匹配原则。可以直接return。1.遇到左括号存对应的右括号。stack:擅长相邻字符的消除操作。2.遇到空,就return。3.左右括号不匹配例如}{

2024-01-22 13:09:25 394 1

原创 代码随想录算法训练营第十天【栈与队列】|232,225

不过为啥peek那是x=self.pop()?而不是self.stack.pop()?用一个queue来模拟队列,因queue fifo而stack lifo。用stack_in和stack_out来模拟queue。python的stack是[]

2024-01-20 10:37:20 334 1

原创 代码随想录算法训练营第八天【字符串】| 344,541,151

双指针反转两头,逐一往中间靠,继续反转要写简洁代码不容易,参考了一下代码注意交换值的简洁写法定义一个function来简化操作因为string immutable,所以复制到一个list来操作这种做法可以处理边界值,当要reverse的string长度小于k时也能操作。

2024-01-18 16:26:28 333 1

原创 代码随想录算法训练营第七天【哈希表】| 454,383,15,18

前两个数组(a,b)相加,与后两个数组(c,d)的和对比,即查0-(c+d)有没有在a,b sum里出现过。要记每个和对应出现的次数(不去重)。时间复杂度O(n^2)(因为是2*O(n^2))双(三)指针法,逐一移动第一个pointer,剩下两个放在剩余数组的两头。同,移动i,j,剩下两个放在剩余数组的两头。不用哈希表,因为要去重容易超时(?要用defaultdict。去重用set就行(?

2024-01-17 17:58:02 349

原创 代码随想录算法训练营第六天【哈希表】| 242, 349, 202, 1

当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值(list对应[ ],str对应的是空字符串,set对应set( ),int对应0)所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止”当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。几个hash:数组(数较少),set(数较多),map(有对应值)用dictionary。

2024-01-17 15:35:51 294

原创 代码随想录算法训练营第四天【链表】| 24,19,160,142

这个终止条件的意思是若是偶数个node,则cur.next==None,若是奇数个node,则cur.next.next == None, 取反的话用and。1.用双指针fast和slow来找到倒数第n个节点,让fast和slow之间间隔n,这样当fast到null时slow正好到倒数第n。思路:数len,算两个len的差,将长的pointer移动此差值,然后一起向右移动直到找到intersection。2.让slow指向倒数第n个节点的前一个,因此fast要走n+1步。快慢指针法,数学推导详见。

2024-01-16 20:56:50 294 1

原创 代码随想录算法训练营第三天【链表】| 203. remove linked list elements, 707. design linked list, 206.reverse linked lis

易错点:for addAtIndex n, 题目要求是在第n个node前插入一个node, 所以要保证第n个node是current.next,这样才能在current.next前添加一个node。双指针法,用pre和cur两个pointer来反转link,反转完pre和cur都向右移动一格,需要用temp来提前记录下一个node。cur是临时的pointer,因为不能修改head pointer(最后要返回此值)注意要删除的是cur的下一个元素;边界是cur.next不为空。

2024-01-13 17:17:19 308 1

原创 代码随想录算法训练营第二天【数组】| 977. squares of a sorted array、209 minimum size subarray sum、59. spiral matrix 2

trick在于第一个while逐一遍历right pointer,然后据此移动left pointer(left pointer 只能向后移动不需要重新从index=0开始),这样就不用两层循环O(n^2)了。又是一个双指针,发现我们的array最大数只能在两头,故用双指针放置两头比较谁更大。学习了下python如何创建一个vector。其实这里的双指针是对暴力解法的一种简化。例子:-4,-1,0,3,10。2.n为奇数和偶数时不同写法。1.注意每条边统一左闭右开。还是双指针(滑动窗口)。

2024-01-12 19:03:14 347

原创 代码随想录算法训练营第一天【数组】| 704. Binary Search、27. Remove Element

记住双指针用法,slow用来update要修改的元素,fast用来找符合条件的元素。之后代码stick to [left,right]

2024-01-12 11:08:33 420 1

空空如也

空空如也

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

TA关注的人

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