- 博客(46)
- 收藏
- 关注
原创 代码随想录第51天|单调栈
尾插入0避免出现一直满足栈条件而无法收获结果的情况(如 2 3 4 5)首插入0避免出现栈内元素不满足2的情况(如 3 1 2)和接雨水相似, 区别在栈内元素轻的沉底。实现方式不同, 此处存放的是下标索引。思路2: 双指针优化。
2024-07-13 09:48:17 429
原创 代码随想录第50天|单调栈
单调栈是对遍历过的元素做记录, 一般是对栈顶的元素 nums[mystack.top()] 做赋值操作的。使用场合: 寻找任一个元素的右边或者左边第一个比自己大或者小的元素位置, 存放的是遍历过的元素。如果想找到右边的元素大于左边, 则需要大的元素沉底 (如 7 3 5 9 1, 7的结果是9)环形数组的处理方式: 1.nums拼接 2.遍历nums.size() * 2。单调栈存储的是索引号。使用map映射索引号。
2024-07-11 21:38:45 404
原创 代码随想录第47天|动态规划
如图 j = 1 时, i 在 1 ~ text1.size 之间时, 即 a 在 abcde 的子序列长度。相当于寻找其最大的子序列, 此时的结果最大。思路2 : 动态规划。
2024-07-11 11:46:49 261
原创 代码随想录第45天|动态规划
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]区别在于是否连续, 无需重新开始遍历。
2024-07-07 18:59:14 295
原创 代码随想录第40天|动态规划
完全背包核心代码 (只在完全背包中一维dp数组嵌套顺序可颠倒, 实际题目需要确定遍历顺序)由于都是由前一个状态推导, 所以只在纯完全背包问题中可以颠倒, 区别是行更新或者列更新。状态转移方程(先物品, 再背包, 并且为递增, 横向更新数值)递推公式: dp[j] += dp[j - coins[i]]状态转移方程(先背包, 再物品, 递增顺序, 且为纵向更新)先物品后背包(仅仅只是组合问题, 不存在排列)先背包后物品(存在排列问题)完全背包物品可以无限使用。概括物体和背包的遍历情况。
2024-07-01 21:37:14 398
原创 代码随想录第38天|动态规划
等价: 尽可能的平分成相同的两堆, 其差则为结果, 比如 (a+b+c)-d, (a+c)-(b+d) , 最终的结果是一堆减去另外一堆的和, 问题则转换成01背包。备注: 当物体容量也等同于价值时, 01背包问题的含义则是利用好最大的背包容量sum/2, 使得结果尽可能的接近或者小于 sum/2。
2024-07-01 20:11:51 198
原创 代码随想录第37天|动态规划
那么只要这时候前面 i-1 在 j-w[i] 空间里构造出最大价值, dp[i-1][j-w[i]],再加上此时放入的i的价值v[i],就是dp[i][j]二维数组的递推公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);二维压缩成一维的递推公式: dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);正序遍历背包容量时, 会出现重复相加的情况, 图中为物品0不断的被累加。
2024-06-30 21:32:47 1496
原创 代码随想录第35天|动态规划
动态规划是由前一个状态推导出来的, 而贪心是局部直接选取最优。在调试时确定其范围, 确定dp数组的大小。debug过程 : dp数组打印查看。
2024-06-26 14:03:48 285
原创 代码随想录第33天|贪心算法
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。返回 需要移除区间的最小数量,使剩余区间互不重叠。
2024-06-24 18:53:50 209
原创 代码随想录第30天|贪心算法
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。判断你是否能够到达最后一个下标,如果可以,返回 true;否则,返回 false。返回 你能获得的 最大 利润。暂时没弄懂, 实现存在疑问。用最少的步数增加覆盖范围。
2024-06-21 15:03:44 324
原创 代码随想录第29天|贪心算法
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。未完全了解去相同元素的方法 , 目前强行去重。中作为 摆动序列 的 最长子序列的长度。子数组 是数组中的一个连续部分。如果连续数字之间的差严格地在。之间交替,则数字序列称为。
2024-06-21 10:56:23 282
原创 代码随想录第28天|回溯算法
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。你可以 按任意顺序 返回答案。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
2024-06-19 18:17:10 956
原创 代码随想录第27天|回溯算法
str.insert(str.begin(), ‘x’) 只能是插入char类型 insert(const const_iterator _Where, const _Elem _Ch)str.insert(0, “x”) 只能是 string类型 insert(const size_type _Off,类似字符串的切割, 传入的区间为左闭右闭 [left, right]str.insert() 发生重载。同样需要进行树层去重。
2024-06-18 22:47:29 201
原创 代码随想录第26天|回溯算法
由于used是经过回溯赋值的, 所以同一层的情况为: [1,0,0] [0,1,0] [0,0,1], 表示开始取数的位置。由于有重复元素的影响, [1,7] 和 [1,7] 其实是两个不同的1, 但不符合条件。而同一树枝, [1,0,0] 和 [1,1,0], 表示用过的元素, 这种情况不排除。used[i - 1] = 1 时, 代表的是同一树枝的情况, 此情况不应该去重。used[i - 1] = 0 时, 代表的是同一树层的情况, 此情况应该去重。同一层是不同的结果, 是不可以选中相同元素的。
2024-06-17 21:16:51 359
原创 代码随想录第23天|二叉树
递归最重要的是把子树也看作一个待解决的过程。在一个函数中可以同时向两边处理。当数组为偶数时, 取靠左的节点。类比于数组的操作, 双指针法。遍历顺序: 右 中 左。把数组中点作为根节点。
2024-06-14 12:35:13 176
原创 代码随想录第21天|二叉树
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值。(相当于暴力解法的第二步, 省略了构造数组的过程)差值是一个正数,其数值等于两值之差的绝对值。1.中序遍历时用两个指针得出最小绝对差。2.遍历有序数组, 寻找之间的差值。实现从下往上的处理过程: 后序遍历。map元素保存至vector中。1.中序遍历转换成有序数组。思路: 直接中序遍历。
2024-06-12 20:28:21 219
原创 代码随想录第20天|二叉树
你需要在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null。虽然开辟额外空间, 但结果依旧受到原来的数影响(当为null时直接借用了原来数的节点)构造二叉树: 使用前序遍历。需要利用二叉搜索树的性质。
2024-06-11 19:31:11 263
原创 代码随想录|链表总结
链表由数据域和指针域组成链表种类单链表双链表循环链表链表基本操作插入和删除操作: 在头部、中间、尾部的插入和删除节点。遍历操作: 通过循环或递归遍历链表。链表高级操作反转链表: 反转单链表或双向链表。合并链表: 合并两个有序链表。检测环: 使用快慢指针检测链表中是否存在环。删除倒数第 k 个节点: 寻找并删除链表中的倒数第 k 个节点。找中间节点: 使用快慢指针找链表中间的节点。链表与数组时间复杂度: 对比链表和数组在插入、删除、访问上的性能。存
2024-06-10 15:36:54 184
原创 代码随想录|数组总结
快速排序: 基准元素划分数组,递归排序,时间复杂度 O(n log n)(最坏 O(n²))插入排序: 将元素插入到已排序部分,时间复杂度 O(n²)(已排序数组 O(n))选择排序: 每次选择最小(或最大)元素放在前面,时间复杂度 O(n²)归并排序: 分割数组递归排序并合并,时间复杂度 O(n log n)冒泡排序: 重复比较相邻元素,交换位置,时间复杂度 O(n²)堆排序: 利用堆结构排序,时间复杂度 O(n log n)
2024-06-10 12:23:05 325
原创 代码随想录第17天|二叉树
给你一个二叉树的根节点root, 按任意顺序, 返回所有从根节点到叶子节点的路径。计算给定二叉树的所有左叶子之和。思路: 迭代法(层序遍历)
2024-06-07 12:11:43 319
原创 代码随想录第13天|栈与队列
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。补充: deque的用法。补充: 大根堆的用法。
2024-06-03 13:08:46 182
原创 代码随想录第11天|栈与队列
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。在 S 上反复执行重复项删除操作,直到无法继续删除。string转char。stoll函数的使用。
2024-06-01 20:59:14 276
原创 代码随想录第9天|字符串
处理字符串时, C++使用string类, 使用size判断是否结束库函数的使用双指针法很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作反转系列当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章KMP算法。
2024-05-31 00:17:17 458
原创 代码随想录第8天|字符串
弄清楚遍历的顺序, i , i + k 和 i + 2k 是关键点。1.reverse函数的使用(操作区间是左闭右开)思路: 模拟实现的过程, 不涉及具体的算法。状态: 需要细看, 实现存在问题。需要重新回看, 实现存在问题。方法1: 使用额外空间。2.双指针从后往前遍历。难点: 去除多余的空格。
2024-05-29 23:05:47 273
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人