![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法训练
文章平均质量分 83
leetcode分类一刷
dc爱傲雪和技术
极限运动员
展开
-
二叉树遍历总结
在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。原创 2024-05-08 16:25:11 · 643 阅读 · 0 评论 -
深搜广搜2s总结
回溯算法,其实就是dfs的过程,这里给出这一圈一圈的搜索过程是怎么做到的,是放在什么容器里,才能这样去遍历。其实,我们仅仅需要一个容器,能保存我们要遍历过的元素就可以,那么用队列,还是用栈,甚至用数组,都是可以的。用队列的话,就是保证每一圈都是一个方向去转,例如统一顺时针或者逆时针。因为队列是先进先出,加入元素和弹出元素的顺序是没有改变的。如果用栈的话,就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。因为栈是先进后出,加入元素和弹出元素的顺序改变了。但大家都习惯用队列了。原创 2024-04-15 16:16:34 · 1063 阅读 · 0 评论 -
回溯算法2s总结
回溯函数模板返回值以及参数在回溯算法中,我的习惯是函数起名字为backtracking,这个起名大家随意。回溯算法中函数返回值一般为void。回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。void backtracking(参数)回溯函数终止条件遍历树形结构一定有终止条件,回溯也有。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。原创 2024-04-12 18:25:12 · 989 阅读 · 0 评论 -
单调栈2s总结
单调栈的本质是空间换时间。单调栈的作用就是存放遍历过的元素递增就是求第一个比他大的元素的位置,递减就是求第一个比他小的元素的位置将当前元素和栈口元素做比较 T[i] 和T[st.top()],再用一个result数组来记录reslult[st.top()]处理循环数组,可以不扩充nums,而是在遍历的过程中模拟走了两边nums。模拟遍历两边nums,注意一下都是用i % nums.size()来操作练习。原创 2024-04-11 15:03:01 · 505 阅读 · 0 评论 -
算法训练day63完结撒花单调栈739每日温度496下一个更大的元素503下一个更大的元素二
什么时候用单调栈。单调栈里面的元素单调递增或单调递减。原创 2024-04-11 12:04:31 · 255 阅读 · 0 评论 -
栈与队列2s总结(不含单调栈)
1.栈可以有效解决匹配问题。在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了。原创 2024-04-10 23:27:22 · 710 阅读 · 0 评论 -
双指针2s总结
在数组:就移除个元素很难么?中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。i++) {这个代码看上去好像是O(n)的时间复杂度,其实是O(n^2)的时间复杂度,因为erase操作也是O(n)的操作。通过两个指针在一个for循环下完成两个for循环的工作。原创 2024-04-09 21:54:01 · 994 阅读 · 0 评论 -
字符串2s总结
在344.反转字符串 (opens new window),我们使用双指针法实现了反转字符串的操作,双指针法在数组,链表和字符串中很常用。接着在字符串:替换空格 (opens new window),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。那么针对数组删除操作的问题,其实在27. 移除元素 (opens new window)中就已经提到了使用双指针法进行移除操作。同样的道理在。原创 2024-04-08 21:39:22 · 581 阅读 · 0 评论 -
数组2s总结Hjk练习
数组为有序数组,同时题⽬还强调数组中⽆重复元素⼆分查找涉及的很多的边界条件,逻辑⽐较简单,但就是写不好。例如到底是 while(left < right) 还是while(left <= right) ,到底是 right = middle 呢,还是要 right = middle - 1 呢?⼤家写⼆分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在⼆分查找的过程中,保持不变量,就是在while寻找中每⼀次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。原创 2024-04-07 11:15:14 · 341 阅读 · 0 评论 -
哈希表2s总结
总结⼀下,当我们遇到了要快速判断⼀个元素是否出现集合⾥的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使⽤额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做⾯试题⽬的时候遇到需要判断⼀个元素是否出现过的场景也应该第⼀时间想到哈希法!⼀些应⽤场景就是为数组量身定做的。在242.有效的字⺟异位词中,我们提到了数组就是简单的哈希表,但是数组的⼤⼩是受限的!这道题⽬包含⼩写字⺟,那么使⽤数组来做哈希最合适不过。原创 2024-04-05 08:38:01 · 813 阅读 · 0 评论 -
算法训练day57leetcode1143.最长公共子序列 1035.不相交的线 53最大子序和
而是dp[6]。在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。那么我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。所以在递推公式的时候,可以直接选出最大的dp[i]。原创 2024-04-03 09:24:50 · 308 阅读 · 0 评论 -
算法训练day56leetcode300.最长递增子序列674最长连续递增序列
本题最关键的是要想到dp[i]由哪些状态可以推出来,并取最大值,那么很自然就能想到递推公式:dp[i] = max(dp[i], dp[j] + 1);因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i] 和 nums[i - 1]。原创 2024-04-02 15:51:14 · 453 阅读 · 0 评论 -
算法训练day55leetcode309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 +总结
309. 买卖股票的最佳时机含冷冻期给定一个整数数组prices,其中第prices[i]表示第*i*天的股票价格。设计一个算法计算出最大利润。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。输入: prices = [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]输入: prices = [1]输出: 0确定dp数组以及下标的含义。原创 2024-04-01 10:11:43 · 882 阅读 · 0 评论 -
排序算法笔记
在小顶堆中,任何一个父节点的值都小于或等于它的子节点的值。原创 2024-03-31 18:53:56 · 922 阅读 · 0 评论 -
二分查找算法
要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是。原创 2024-03-31 11:51:44 · 398 阅读 · 0 评论 -
快慢指针(Floyd 判圈法)证明
起始位置在链表的开头。每次 fast 前进两步,slow 前进一步。如果 fast 可以走到尽头,那么说明没有环路;如果 fast 可以无限走下去,那么说明一定有环路,且一定存 在一个时刻 slow 和 fast 相遇。当 slow 和 fast 第一次相遇时,我们将 fast 重新移动到链表开头,并 让 slow 和 fast 每次都前进一步。当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。原创 2024-03-30 16:00:13 · 450 阅读 · 0 评论 -
算法训练day53Leetcode121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II
那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。:如果前一天就不持有股票,则继续不持有的利润是。如果前一天持有股票,那么今天卖出股票的利润是。(从第二天开始计数,即。原创 2024-03-27 10:51:13 · 388 阅读 · 0 评论 -
算法训练day52leetcode198. 打家劫舍 213 打家劫舍2337. 打家劫舍 III
这种方法巧妙地将圈形排列的房屋问题转化为了两个线性排列的房屋问题,并复用了原始“打家劫舍”问题的解决方案。这样不仅提高了代码的复用性,也简化了问题的解决流程。最终,通过比较两种情况下的最大盗窃金额来得到全局的最大值。原创 2024-03-27 08:25:17 · 786 阅读 · 0 评论 -
算法训练day51Leetcode139.单词拆分 多重背包了解 背包问题总结
代码随想录。原创 2024-03-26 09:33:50 · 345 阅读 · 0 评论 -
HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ17 坐标移动
C++中,可以通过不断地将数字右移并检查最低位是否为1来实现这一点。通过减去最大的2的幂次方数,逐步减少数字,直到数字变为0,从而计算1的数量。一开始不知道sort可以直接排序字符串,于是自己写了一个比较函数逐字符比较。函数对它们进行字典序排序,最后输出排序后的字符串列表。首先,我们读取给定数量的字符串,然后使用。使用C++的标准库函数。原创 2024-03-25 16:08:53 · 217 阅读 · 0 评论 -
算法训练day50卡玛70. 爬楼梯(进阶版)Leetcode322. 零钱兑换279. 完全平方数
级台阶爬上来(只要这些台阶的索引大于等于0),因此到达第。我们可以使用动态规划。动态规划的思想是用一个数组。来保存到达每一级台阶的方法数。级台阶的方法数就是这些。原创 2024-03-25 14:54:28 · 425 阅读 · 0 评论 -
算法训练day44完全背包518. 零钱兑换 II377. 组合总和 Ⅳ
这种动态规划方法有效地将一个看似复杂的组合问题分解为了更小、更易于管理的子问题,通过解决这些子问题并逐步构建解决方案,最终达到了求解总问题的目的。在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。,因为达到总和为 0 的方式只有一种,即不使用任何数字。,对于每一个可能的目标值,尝试找到组合它的所有可能方式。该解法使用了动态规划的方法,创建了一个动态规划数组。): 这个循环遍历所有的目标值,从 0 到。,尝试将其加到之前的组合中。的目标数的组合方式数量。之后的目标值的组合数。原创 2024-03-24 22:49:09 · 332 阅读 · 0 评论 -
HJ10 字符个数统计HJ11 数字颠倒HJ12 字符串反转
string str;cin >> str;// 读取输入// 自定义反转i < n / 2;++i) {// 输出结果return 0;原创 2024-03-24 00:44:18 · 908 阅读 · 0 评论 -
HJ6 质数因子HJ7 取近似值HJ8 合并表记录HJ9 提取不重复的整数
是一个基于红黑树的容器,它可以保持键值对按键排序,并且每个键是唯一的。当我们尝试插入一个已经存在的键时,我们可以简单地将新的值加到已存在的值上。我们可以使用C++的标准库函数。我们会接收一个正浮点数,然后根据它的小数部分决定是向上取整还是向下取整。来自动对index进行排序,并且合并相同index的value值。函数向上取整,但这里我们要根据小数点后的值决定取整的方向。为了方便检查数字是否已经被加入到新整数中,我们可以使用一个。来存储已经处理过的数字,因为集合自动处理重复项。要实现这个功能,我们可以使用。原创 2024-03-22 12:00:01 · 772 阅读 · 0 评论 -
HJ3 明明的随机数HJ4 字符串分隔HJ5 进制转换
明明生成了�N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。数据范围: 1≤�≤1000 1≤n≤1000 ,输入的数字大小满足 1≤���≤500 1≤val≤500。原创 2024-03-21 17:03:44 · 476 阅读 · 0 评论 -
Hj22汽水瓶HJ1 字符串最后一个单词的长度HJ2 计算某字符出现次数
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)原创 2024-03-20 20:02:20 · 744 阅读 · 0 评论 -
算法训练day41Leetcode343. 整数拆分 96.不同的二叉搜索树
给定一个正整数n,将其拆分为k个的和(k >= 2),并使这些整数的乘积最大化。返回你可以获得的最大乘积。原创 2024-03-09 09:55:53 · 362 阅读 · 0 评论 -
算法训练day39Leetcode62不同路径63不同路径2
一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?283从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -> 向右 -> 向下2862 * 109。原创 2024-03-08 10:39:47 · 922 阅读 · 0 评论 -
算法训练day38动态规划基础Leetcode509斐波纳切数70爬楼梯746使用最小花费爬楼梯
对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。斐波那契数 (通常用 表示)形成的序列称为 斐波那契数列 。该数列由 和 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1)= 1F(n) = F(n - 1) + F(n - 2),其中 n >原创 2024-03-07 18:36:17 · 627 阅读 · 0 评论 -
算法训练day36Leetcode435 无重叠区间736划分字母区间56合并区间
其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。左边界排序我们就是直接求 重叠的区间,count为记录重叠区间数。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。原创 2024-03-06 10:20:32 · 829 阅读 · 0 评论 -
算法训练第一天_Leetcode704二分查找27移除元素
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。原创 2023-12-28 07:05:09 · 1655 阅读 · 1 评论 -
算法训练day02Leetcode977有序数组平方209长度最小的字数组59螺旋问题
这意味着,尽管它在外层循环的内部,但是整个数组在整个算法过程中只被遍历了两次:一次是加入窗口(外层循环),另一次是离开窗口(内层循环)。由于内层循环和外层循环都是线性的,并且它们不是严格的嵌套关系(即,内层循环不会对于外层循环的每次迭代都执行n次),整个算法的时间复杂度是 O(n)。:对于外层循环中的每个元素,内层循环从当前元素开始,一直遍历到数组的末尾。这意味着,该函数的时间复杂度与矩阵中元素的总数成平方关系,这对于这类问题来说是相当高效的,因为你必须至少访问一次矩阵中的每个元素。原创 2023-12-29 13:51:22 · 1495 阅读 · 1 评论 -
算法巡练day04Leetcode24交换节点19删除倒数节点142环形链表
那么相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。原创 2024-01-03 21:01:31 · 1549 阅读 · 0 评论 -
算法巡练day03Leetcode203移除链表元素707设计链表206反转链表
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。, 这才是新的头结点。变量在删除链表节点的过程中发挥着重要的作用,既确保了链表结构的完整性,又避免了潜在的内存泄漏问题。原创 2024-01-02 16:20:20 · 1667 阅读 · 0 评论 -
算法训练day6Leetocode242有效字母异位词349两个数组交集202快乐数1两数之和
这一步确实妙,只用一个数组解决了问题,进一步节省空间。时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。原创 2024-01-05 09:18:34 · 1019 阅读 · 0 评论 -
算法训练day7Leetcode454四数相加383赎金信15三数之和18四数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n。道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!原创 2024-01-07 19:43:00 · 1821 阅读 · 0 评论 -
算法训练day15Leetcode102二叉树层序遍历226翻转二叉树101对称二叉树
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。原创 2024-01-15 07:11:40 · 962 阅读 · 0 评论 -
算法训练day21Leetcode530二叉搜索树的最小绝对差501二叉搜索中的众数236二叉树最近公共祖先
在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。原创 2024-01-24 07:07:51 · 1098 阅读 · 0 评论 -
算法训练day20Leetcode654最大二叉树617合并二叉树700二叉树中的1搜索98验证二叉搜索树
合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。原创 2024-01-20 21:05:25 · 1357 阅读 · 0 评论 -
算法训练day12Leetcode239滑动窗口最大值347前k个高频元素
可以出一道面试题:栈里面的元素在内存中是连续分布的么?这个问题有两个陷阱:陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。陷阱2:缺省情况下,默认底层容器是deque,那么deque在内存中的数据分布是什么样的呢?答案是:不连续的,下文也会提到deque。所以这就是考察候选者基础知识扎不扎实的好问题。在栈与队列系列中,我们强调栈与队列的基础,也是很多同学容易忽视的点。使用抽象程度越高的语言,越容易忽视其底层实现,而C++相对来说是比较接近底层的语言。原创 2024-01-13 17:16:56 · 1507 阅读 · 0 评论