- 博客(22)
- 收藏
- 关注
原创 代码随想录算法训练营第二十八天|贪心算法part2
相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。这里错误的地方在于更新最大覆盖范围总是用当前元素的值去更新 事实上最大覆盖范围可能是之前元素的值。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。思路:跳不过去的坎是0 我本来想收集所有0的下标 然后判断每一个带0的下标是否可以跳过去。用覆盖范围去求解 每遍历一个单位 更新全局覆盖范围。
2025-04-08 14:29:55
322
原创 代码随想录算法训练营第二十七天|贪心算法part1
时间复杂度有点高 贪心策略是 尽量较少饼干的浪费 即大饼干应该尽可能分给胃口大的孩子 所以可以从后往前遍历。遇到正数加到结果当中更新全局最大值 遇到负数也加到结果中 如果此时结果小于0则让结果归零。用preDiff 与curDiff来比较 两者乘积满足小于0即可更新结果。考虑只有一个元素和全是负数的特殊情况。考率只有两个元素的情况。
2025-04-07 20:54:40
126
原创 代码随想录算法训练营第二十五天|回溯法part4
快速从一个vector中查找指定元素 用find(nums.begin(),nums.end((),target)返回迭代器。排列强调顺序 我这里用了一个set set无序的 不能用这个来收集路径。因为不能改变原来的顺序 所以之前的去重不能直接套用 需要做以下改变。下面的代码 会求出所有长度大于等于二的子序列 并没有递增。本题的难点在于不能改变原序列的顺序,所以用排序是错的。在回溯算法中 当前递归层的for循环算作同一层。每层不能有重复元素 用一个set来记录。
2025-04-02 16:49:08
197
原创 代码随想录算法训练营第二十四天|回溯法part03
用一个path收集结果,path.size等于4的时候 作为终止条件,要处理path总size不等于s.size的情况。然后回溯到1 现在开始在22里选择第二个2 但是 这种情况要跳过 if nums[i-1]==nums[i]不行 因为这样会错过往深了递归的情况 所以 只有 nums[i-1]=false的时候 才能continue。错误原因:回溯的时候 没有处理 use[i]=false;如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,第一次先选1 在剩下的22里递归 最终得到1,2,2。
2025-04-01 21:08:14
210
原创 代码随想录算法训练营第二十三天|回溯法part2
判断startIndex到i之间的子串是否是回文串 如果是加入 继续更新startindex 继续下一轮判断。对于第二个1 前一个1没有被使用 并且第二个1与第一个1相等,此时不考虑这种情况 continue。used[i - 1] == false为什么是false的解释。另一个 可能出现 223 322这样的情况。错误之处:会出现重复的答案,没有去重。考虑112 目标值等于3。
2025-04-01 17:18:24
127
原创 代码随想录算法训练营第二十二天|回溯法part1
思路与上题一样 ,不可能用k个for循环的,用递归思路。用递归 递归决定深度 for循环决定宽度。思路:暴力解,但是会套k个for循环。以树的数据结构来理解回溯法。17.电话号码的字母组合。怎么写这k个for循环呢。216.组合总和III。3.确定for循环内容。
2025-03-17 14:56:08
173
原创 代码随想录算法训练营第二十一天
将有序数组转换为二叉搜索树思路:利用二叉搜索树的特点 ,当前节点的左右子树都是二叉搜索数,从数组中间把当前数组一分为二,中间元素作为根节点,递归构建左右子树。把二叉搜索树转换为累加树遍历一次二叉树,得到升序排列的结果。结果从后往前累加,再次遍历二叉树,把累加值赋给当前节点二叉搜索树的中序遍历(左中右)可以得到按小到打排列的顺序,若是按照右中左的顺序遍历,可以得到从大到小排列的顺序。
2025-03-10 16:36:14
298
原创 代码随想录算法训练营第20天|二叉树part7
利用二叉搜索树的特性,二叉搜索树要用中序遍历。235. 二叉搜索树的最近公共祖先。公共祖先一定是满足在两个数中间。701.二叉搜索树中的插入操作。删除二叉搜索树中的节点。上面的代码没有释放内存。
2025-03-10 11:16:17
199
原创 代码随想录算法训练营第十八天|二叉树part6
如果左空 右不空 应该把右返回给上一层。如果右空,左不空,应该把左返回给上一层。530.二叉搜索树的最小绝对差。问题:1.ans数组的更新逻辑。236. 二叉树的最近公共祖先。都不为空的话 就返回当前节点。501.二叉搜索树中的众数。2.pre数组的初始化问题。应该存储所有出现次数等于。
2025-03-08 16:33:20
140
原创 代码随想录算法训练营第十六天|二叉树part4
思路简单题:用层次遍历 用一个数组来存放每一行的值,最后一行的第一个元素即为所求。第三步:构建当前节点 如果是叶节点 返回。第一步:确定递归函数返回值 返回节点。从中序与后序遍历序列构造二叉树。第二步:确定边界条件 返回空指针。从前序列跟中序构造二叉树。注意数组的切割怎么切割。否则遍历构造左右子节点。
2025-03-06 19:52:32
101
原创 代码随想录算法训练营第十五天|二叉树part3
这里第一次写的时候犯了个错误,就是把所有的左孩子节点都加进去了,但是答案只需要左叶子节点,因此多加了一个判断是否是叶子节点。遍历二叉树的每个节点,把该节点值加入路径,发现该节点的左右子树都为空,则将路径加入答案。我漏了回溯了 就是回溯的时候将当前元素移除路径。思路:层次遍历 遍历所有节点 若其左孩子节点不为空 则加进去。平衡二叉树的定义:每个节点的左右子树高度只差不超过一。完全二叉树的节点个数。
2025-03-04 22:37:24
149
原创 代码随想录算法训练营第十四天|二叉树part2
思路:对二叉树每个节点的孩子节点进行交换,也就是需要用到遍历二叉树,二叉树的遍历有两种方式,第一中,深度遍历,第二种广度遍历(层次遍历)这里如果左子树为空,右子树非空,这里会得到1,但是 ,最小深度要求的是左右子树都为空才行。第一种:层次遍历 寻找当前层左右孩子都为空的节点 如果存在 那么最小深度就到这里了。第一种 :递归法 用深度遍历 ,递归去求 当前树的高度等于左右子树的最大高度+1。以层次层次遍历为模板,遍历的每个节点都交换它的左右子节点。递归法,当前树的最小深度等于左右子树的最小深度+1。
2025-03-02 17:20:42
126
原创 代码随想录算法训练营第十三天|二叉树part1
理论基础,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表。二叉树的存储方式:链式存储,数组存储看如下中间节点的顺序,就可以发现,中间节点的顺序就是所谓的遍历方式递归遍历递归代码书写步骤,第一:确定返回值,第二:确定终止条件第三:确定单层处理的逻辑。
2025-03-02 14:31:21
227
原创 代码随想录算法训练营第11天|栈与队列part02
小顶堆的实现需要三个参数 第一个是存的内容 第二个是底层容器 第三个是比较的类。用双端队列来实现,可以访问队尾元素,队首存储的是当前窗口元素的最大值的索引。代码随想录网站用long long型 longlong型8字节。队尾进出队:dq.push_back()150. 逆波兰表达式求值。239. 滑动窗口最大值。
2025-03-01 15:13:52
183
原创 代码随想录算法训练营第十天|栈与队列1
理论基础所以STL中栈往往不被归类为容器,而被归类为container adapter(232.用栈实现队列文章讲解:不熟悉栈的具体使用代码,这里可以多记一下,栈的声明与函数调用。225. 用队列实现栈思路:每次把元素插入队列后,都把队列长度n-1的元素出队再入队。队列访问队首元素用front(),栈访问最顶元素用top()20. 有效的括号强调先后顺序,先进来的后匹配,所以用栈来存储,遇到左括号就压栈,遇到右括号就出栈。问题:没有考虑先进的是右括号,没有处理不匹配的逻辑。
2025-02-25 22:44:54
179
原创 代码随想录算法训练营第九天|字符串part2
是一个成员函数,用于删除字符串中的一部分内容。当使用迭代器作为参数调用。时,它会删除指定位置的字符,并返回指向。卡尔解法:整体反转 再局部反转。28. 实现 strStr()卡码网:55.右旋转字符串。151.翻转字符串里的单词。已经失效,因此继续使用。)会导致未定义行为。
2025-02-25 20:30:26
126
原创 代码随想录算法训练营第八天|字符串part1
思路:简单题,交换标之和等于数组长度-1的元素。这里end=min{}的思想真的不错!541. 反转字符串II。卡码网:54.替换数字。
2025-02-23 13:55:32
147
原创 代码随想录算法训练营第七天|哈希表2
454.四数相加II383. 赎金信思路:简单题 将字母映射成一个有26个元素的数组 若该字母出现1次 则数组对应位置的值+ 115. 三数之和解答一:暴力解法,超时!!注意a的去重 ,判断a[i]=a[i-1]和a[i]=a[i+1]意义是不一样的,前者是跟以前的比,相当于回顾历史,而后者相当于展望未来。这里想清楚 很重要!!!!!
2025-02-22 15:53:58
222
原创 代码随想录算法训练营第三天|链表
链表基础知识:熟记链表节点的定义性能分析,删除与插入的时间复杂度是O(1),查找的时间复杂度是O(n)。203.移除链表元素常规的移除链表分为移除头节点和非头节点使用虚拟头节点:707.设计链表增删查查找的current=dummyHead->next删跟增的current=dummyHead206.反转链表双指针法。
2025-02-16 12:01:30
196
原创 代码随想录算法训练营第一天|704.二分查找
会出现不管怎么更新 left一直等于middle,从而进入死循环。遍历nums中的所有元素,每次遍历k都加1,如果出现当前元素等于val,将当前元素之后的所有元素前移一格,然后k-1。第二种,双指针 找绝对值最小的 然后从最小值的两端开始比较 ,这个思路实现起来太复杂了,还不如从最边边开始比较。思路:首尾双指针比较中间元素,若target小于中间则在左边区域 ,否则在右边区域,有一点递归思想。问题在于后面的元素前移后,应该继续从当前元素开始遍历,而且遍历长度也应该减1。会超出整数类型的范围。
2025-02-13 00:04:40
295
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人