自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营day31|理论基础、455、376、53

predif = 0是有单调的出现,但是如果curdiff=0设置全部情况有问题,因为一开始predif为0,默认初始值左边有个一样值的元素。只要连续和不是负数,他都有可能让后面的数变大,所以仍然可以继续➕下一个元素进行判断。3.单调坡有平坡:prediff只记录初始的摆动方向,当摆动出现时。小于或者小于等于都可以,如果要记录最短的最大连续和子序列,那么等于。局部最优:单调坡上的元素都给删掉,->全局最优:最长的摆动子序列。颠倒遍历顺序不可以,外层一直移动的,内层是动态移动的。

2023-11-10 01:58:52 118

原创 代码随想录算法训练营day30|332、51、37、总结

不需要有终止条件,数字填满后自然就到了终止条件。vector只是一个container!ticket和target要彼此映射到。把n皇后问题当作树形结构处理!

2023-11-09 03:36:38 121

原创 代码随想录算法训练营day29|491、46、47

此时要确定used[i-1] ==false;此时前一个没经历,那么后一个必然经历,则树枝上重复元素。used数组标注哪些元素使用过了:之前组合问题用startIndex减少同层重复。本题采用的树层去重,在树枝层面(深度上)不去重,即对重复元素的排列去重。注意一定要进行排序,不然不能判断树层重复!重复元素带来的问题:重复的排列情况出现。确保uset查找的元素之前没出现过。一维数组单个结果,二维数组结果集。单层循环从0开始,因为排列问题。无重复元素:不用考虑去重。树层去重,树枝去重。

2023-11-08 14:36:31 112

原创 代码随想录算法训练营day28|ac一下:93、78、90

使用set去重,除此之外都是回溯三部曲。

2023-11-07 14:06:58 90

原创 代码随想录算法训练营day27|39、40(不太会)、131

path.push_back的是对应下标的元素。单层递归是需要对当前i进行递归。pop_back不需要参数。本题目每个元素可以重复选。本题目依然可以做剪枝操作。

2023-11-07 13:28:22 23

原创 代码随想录算法训练营day25|组合(77剪枝优化)216、17

也是回溯算法,感觉都一个套路,写呗。

2023-11-06 14:00:45 28

原创 代码随想录算法训练营day24|回溯理论基础、77

所有回溯法都可以抽象为树形结构:从上倒下递归,横向for,int startindex记录下一次递归的起始位置。效率:纯暴力搜索,有些问题暴力搜索已经很不错了。递归和回溯相辅相成,递归函数下面回溯过程。最好抽象成一个图形结构,方便回溯模拟。2.切割问题:切割字符串、回文字串。5.棋盘问题:n皇后,解数独。

2023-11-06 09:36:36 21

原创 代码随想录算法训练营day23|669、108、538、总结

后序遍历可以适用于数组问题。本题为二叉树,右中左遍历。注意根节点不符合要求是,其左右孩子的变化。确定好本题区间边界:左闭右闭。某个节点不符合,其右子树不一定不符合。使用引用不用重复copy数据空间。上一层接受下一层返回的孩子节点。选取中间节点,递归遍历左右子树。右中左遍历有意思,双指针。mid只是数组下标!

2023-11-03 02:15:57 132

原创 代码随想录算法训练营day22|235、701、450

利用bst特性,从上到下中序遍历。利用bst的搜索特性。从上往下去二叉搜索。此时记得要终止函数。

2023-11-02 14:13:00 191

原创 代码随想录算法训练营day21|530、501、236

530采用中序遍历501双指针法解决问题。236后序处理中间节点。

2023-11-02 13:46:53 256

原创 代码随想录算法训练营day20|654、 617、700、98

但其实不太好的,也有可能出现更小的值。数据区间确定时确保数据区间设置都一样:for example 左闭右开。确定遍历顺序:二叉搜索树利用特性,中序遍历能判断是否单增。二叉搜索树的特性掌握,不用强调遍历顺序,本来自带顺序。改成定义前一个指针更好,直接比较不同指针的值。直接在原树上更改数组就好,不用创建新的数组。如果重新定义二叉树,把两个值传给原值就行。指针比较的是值不是指针本身。只不过先序同步遍历两个二叉树。不传值怎么判断最后成立?判断清楚val才是要找的值。

2023-10-31 02:10:56 604

原创 ml细节记录(hw1)

2023-10-31 00:30:41 22

原创 day8 DAG将算法统一于动归

const pass = dfs(i-1) //不选。nums.sort((a,b)=>a[1]-b[1]) //按照截至日期递增排序。nums.sort((a,b)=>a[1]-b[1]) //按照截至日期递增排序。dp[i] = Math.max(pick,pass) //最值。const bs = (l,r,check) =>{ //寻找右边界的代码。const bs = (l,r,check) =>{ //寻找右边界的代码。

2023-10-29 07:36:51 36

原创 代码随想录算法训练营day18|513、112、113、106、105

代码冗余为了体现出递归之后的回溯过程:这部分递归之后又回溯到了上一层。对根节点要判断,null值和不是,后者在count形参数要做减法。因为中间不需要遍历,前中后序都合适。能体现出左在右的前面就可以。在每单层递归,遍历的都是某单一路径,所以用path。搞清楚对中序/后序切割的模式,左闭右开?下次再做,回顾好106做题模式后。path公共变量,记得加路径!后序中间在最后,可以进行切割。没有对中间节点的处理逻辑。

2023-10-28 14:24:11 1014

原创 代码随想录算法训练营day17|110、257、404

递归逻辑:终止条件时,我要判断左孩子之和,要从父节点出发,所以当某个节点没有叶子节点时,条件终止。后序遍历会好点:判断左右子树的左叶子之和,返回给上一层节点。相辅相成的,回溯的过程就在递归的下面。如果前序遍历,左右还没得到怎么可能先遍历中呢?后序遍历解决问题:确保递归三要素。-1意义是这个树不是平衡。求路径需要前序遍历。path表示路径添加。

2023-10-27 02:32:18 1253

原创 Day6 顺序角度划分动归五大类型

五大类型是建立dag图最主要的方式。所有数据结构优化为dag。

2023-10-27 01:00:40 30

原创 代码随想录算法训练营day16|104、111、222

同样的写法,用递归思路。

2023-10-26 13:40:18 357

原创 Day5 动归

if(indeg[y] === 0) queue.push(y) //y不依赖于任何点,y的值求出来了,可以入队。dp[y] += dp[x] //y已经接收到x传来的值了,注意这里的递推公式是求和,你能想出什么递推公式呢?if(indeg[y] === 0) dfs(y) //y不依赖于任何点,y的值求出来了,可以入队。[2] : [x+1,x+2] //next代表x的邻接节点。dp.set(y,(dp.get(y)||0) + dp.get(x)) //y接受到x传来的值了。

2023-10-26 04:07:38 30

原创 代码随想录算法训练营day15|层序遍历、226、101

中序遍历:左,中,右,相当于一直在遍历之前的左子树。左右中,先判断左右,才能在这基础上判断中。取size记录本层的节点数量;最后终止条件为返回root.用队列进行层序遍历;利用递归三部曲来解决。判断左右子树可以翻转。

2023-10-25 03:38:42 428

原创 day4 DFS后序传值的递归模拟与四对顺序的值传递

xor1 = xor[tree1] ^ xor[tree2] ^ xor[tree3] //删除tree2 + 删除tree3。dp[i] = new Node(dfs(i-1,dp[i]) + dfs(i-2,dp[i])) //后序*邻接 → FN传递。xor2 = xor[tree2] ^ xor[tree3] //删除tree3。xor3 = xor[tree3] ^ xor[tree2] //删除tree2。xor[cur] ^= xor[next] //后序 * 邻接:xor[cur]

2023-10-25 02:16:17 23

原创 day3:先序dfs传值与递归模拟

const case1 = x === 0 && vis === 1 //当x == 0时,需要访问的邻接节点的个数为1。== 0 && vis === 2 //当x!const [x,vis] = stack[stack.length-1] //vis用来标记访问过几个邻接节点。if(indeg[y] === 0) dfs(y) //y不依赖于任何点,y的值求出来了,可以入队。[2] : [x+1,x+2] //next代表x的邻接节点。dp[y] += dp[x] //y已经接收到x传来的值了。

2023-10-24 14:31:04 22

原创 代码随想录算法训练营day14|二叉树理论基础、递归遍历(144 145 94)、迭代遍历、统一迭代

一定要注意,确保可以手写出来,leetcode已经帮我们封装好了,但实际开发并不是如此。1.深度优先搜索:前中后序遍历,一般递归实现,也可以使用迭代法。2.广度优先搜索:层序遍历(用队列实现对二叉树的遍历)迭代法。5.平衡二叉搜索树:同时满足平衡二叉树和二叉搜索树的要求。前序:中左右->中右左->翻转二叉树->左右中(后序遍历)迭代模拟递归也用栈来实现:注意进栈顺序为中右左(前序 )2.完全二叉树:除了底层都是满的,但底部从左到右连续的。3.二叉搜索树:对节点布局没要求,顺序有要求。2. 确定终止条件;

2023-10-24 13:59:17 1802

原创 Day2: BFS先序传值与递推|509,207,1857

出队的顺序就是拓扑排序的顺序。1.扩展:把该点传给下一个点。入度表示依赖于多少个点。1.状态:边界+目标;队列里面需要已知点。

2023-10-23 12:31:16 29

原创 代码随想录算法训练营day13|239、347、总结

优先级队列要定位为 左大于右,才能算小顶堆,和快排等正好相反,优先级队列的定义正好反过来了,可能和优先级队列的源码实现有关(我没有仔细研究),我估计是底层实现上优先队列队首指向后面,队尾指向最前面的缘故!,因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。2.利用堆来处理数据:如果使用大顶堆,pop出去的会把大的元素排出去。大顶堆:每个结点的值都大于或等于其左右孩子结点的值。小顶堆:每个结点的值都小于或等于其左右孩子结点的值。1.可以使用map数据结构,

2023-10-23 11:38:26 1727

原创 代码随想录算法训练营day11|20、1047、150

判断条件其中之一为:判断模拟的字符串是否为空!c++除法取整方式:向零取整,舍掉小数部分。后缀表达式,按照顺序处理,不用担心括号问题。判断清楚几种情况,括号能不能对应起来。用字符串直接模拟栈的行为。

2023-10-22 12:48:21 1305 1

原创 值传递将数据结构统一于dag

dag可以当作最复杂的值传递结构,环图处理为dag,引入单调收敛变量当做dag图。dag:值传递角度来说所有数据结构都是dag。3.实现:拓扑排序(拓扑:图形之间的关系?所有数据结构从拓扑排序角度讲都是线性结构。2.顺序:适用于所有数据结构。逻辑结构,点和边的关系。

2023-10-22 10:48:17 44 1

原创 代码随想录算法训练营day10|理论基础、232、 225

STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)栈不提供走访功能,也不提供迭代器(iterator)队列实现栈,简单操作,目前时空复杂度还没有优化。两个栈实现队列操作,基本操作。

2023-10-20 14:12:13 1961 1

原创 代码随想录算法训练营day09|28、459、字符串总结、双指针回顾

next数组 or prefix数组一个意思:遇到冲突之后,回退到的下一个位置:前缀表原封不动作为next数组,也可以实现kmp,next只不过是一个中间数组,找相等前后缀的方式不一样。kmp算法:解决字符串匹配问题,发明该算法三位学者首字母。最长的相等的前后缀不包含的子串就是最小重复子串。关键点:前缀表 ->最长相等前后缀来计算。前缀:不包含尾字母,后缀:不包含尾字母。j 前缀末尾 j=0;4.更新next数组。暴力解法思路可以解决。

2023-10-19 13:23:03 2057

原创 代码随想录算法训练营day08|344、541、剑指offer5、151、剑指offer58

库函数学会使用,如果库函数直接解决,不用;如果是解题一部分,知道库函数的逻辑/时空复杂度,则使用。因为要在最后的一个element前面置换,所以要i<=s.size()相对于vector<char>,string重加载了很多运算符。先扩充数组,再从后序遍历,时间复杂度为o(1).考虑正常库函数(包括reverse函数)左闭右开。一般来说,编程语言实现的函数都是左闭右开。erase,时间复杂度o(n)注意双指针法的指针移动!使用库函数时注意形参写法。注意此时i<j的判断。

2023-10-18 05:17:32 2131 1

原创 代码随想录算法训练营day07 |454、383、15、18

num[i] == num[i-1],和前面的判断,如果相等,说明前面已经出现同样的三元组了,直接continue。排序后不能依照 nums[k] > target 来剪枝,因为target有可能是负数,负数相加更小。continue跳出本次循环,则会进入while判断中,个例会一直重复,超出time limit。一开始想用map,有问题,先考虑能否用hasp,再选择array/set/map.要计数,所以不用判断找没找到,有判断的话则一直加不进去。k,i,两层逐层剪枝,之后遍历left,right指针。

2023-10-17 13:28:10 2207

原创 代码随想录算法训练营day06 |242、349、202、两数之和

必然的,每个位的平方和始终在一个限定的数据区间内。当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。看清题目意思,给定的是数组,所以哈希表的大小要大于数组最大的值。unordered_set 当做无限扩容的数组。注意unordered_set初始化方式。要考虑元素数值和元素下标,需要使用map。auto变量可以自动选择匹配的数据类型。可以直接{}给array所有元素赋值;map的作用是什么?注意 % 和 / 不要搞混了。索引字符串中的元素s[]注意find函数返回值。

2023-10-16 01:28:06 2338 1

原创 代码随想录算法训练营day04 |24、19、面试题 02.07、142、链表总结

c.如果有重合节点,那该重合节点之后的节点都重合,gap的部分肯定不会重叠,cur1先走到尾部重叠的部分。快指针不会跳过慢指针,慢指针也在往前走,相对移动速度为1,相对于慢来说不动,快每次动1。分析问题,快指针移动n+1,此时移动慢指针,删除的指针则在cur -> next。写代码前确定问题处理模式,此问题中需要使用的两个节点要先换成临时变量。注意对问题的数学推导!头节点和相遇节点同时出发1移动速度肯定会相遇。快指针至少走一圈和慢指针相遇,obviously。a.计算完长度要重新回到头节点。

2023-10-14 07:18:08 2433 1

原创 代码随想录算法训练营day03 | 203、707、206

c++初始化怎么忘记了。再遍历完了之后定位头节点,dummyhead->next即可。都使用虚拟头节点的操作,统一链表的操作(包含删除,增加节点)考虑全部情况,如果正常节点不满足val应该顺延到下一个节点。此时pre相当于 dummy point ,初始化为空指针。判断头节点需要check用if还是while。要清楚每次递归要做的操作是什么,temp,翻转。head指针都在变化,要定义一个临时指针。考虑cur ==0的边界情况。

2023-10-13 14:48:26 2475

原创 代码随想录算法训练营day02 | 977、209、59

数组经典题目。

2023-10-12 08:27:27 2755

原创 代码随想录算法训练营day01|704,27

1.暴力解发:i--,size--发生在出现了要删除的数值时候,才进行变化。整体采用左闭右闭区间,要注意没有目标数据的情况处理,return -1;2.双指针:快慢指针,慢指针当做更新数组,if判断很巧妙。

2023-10-11 14:14:02 672

原创 BST刷题心得

我们通过使用辅助函数,增加函数参数列表,在参数中携带额外信息,将这种约束传递给子树的所有节点,这也是二叉树算法的一个小技巧吧。遍历每个i数值对应的节点,已经建立好左右子树之后,那遍历左右子树,每一个都可以是以i为节点的左右节点。要删除掉右子树最小节点,同时返回整个书的节点,所以遍历到当前节点的右子树,来进行进一步的递归。

2023-08-29 21:55:03 27 1

空空如也

空空如也

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

TA关注的人

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