- 博客(37)
- 收藏
- 关注
原创 【代码随想录第48天】动态规划7
完全平方数 是一个整数,其值等于另一个整数的平方;例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。此时我们要选择最小的dp[j],所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);2.dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。1.含义:dp[j]:和为j的完全平方数的最少数量为dp[j]dp[0] = 0;
2023-10-23 17:33:53 239
原创 【代码随想录第46天】 动态规划6
第i件物品的重量是weight[i],得到的价值是value[i]。dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。01背包和完全背包唯一不同体现在遍历顺序上,完全背包遍历背包是正序遍历。递推公式:dp[j] += dp[j - coins[i]];遍历顺序:先遍历物品再遍历背包得到组合数(不考虑顺序)跟上面的区别:强调顺序, 因此先遍历背包,后遍历物品。dp[j]:凑成总金额j的货币组合数为dp[j]先遍历背包后遍历物品得到排列数。确定dp数组以及下标的含义。
2023-10-20 18:33:08 193
原创 【代码随想录第45天】动态规划5
1049. 最后一块石头的重量 II1049. 最后一块石头的重量 II思路就是尽量把石头分成重量总和相等的两堆,想明白这个,就跟416题没什么区别了public://尽量把石头分成重量总和相等的两堆sum += n;i++){j--){
2023-10-20 17:38:04 187
原创 【代码随想录第44天】动态规划4
要求掌握01背包(基础),和完全背包, 多重背包完全背包是01背包稍作变化而来,即:完全背包的物品数量是无限的。
2023-10-09 15:31:32 150
原创 【代码随想录第43天】动态规划3
因此总的递推公式为:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j))所以j固定时,递推公式为: dp[i] = max((i - j) * j, dp[i - j] * j)j的取值范围是 1 到 i/2,需要遍历所有的j得到 dp[i]的最大值。dp[i]:拆分数字i,可以得到的最大乘积为dp[i]。j * dp[i - j]: 拆分成三个数及以上。j * (i - j):拆分成两个数。
2023-10-09 13:56:39 45
原创 【代码随想录第42天】 动态规划2
要优化空间复杂度,可以使用一个一维的dp数组,其中dp[j]表示在当前行第j列位置的不同路径数量。因为每一行的路径数量只依赖于前一行和当前行的路径数量,所以可以通过不断更新dp数组来计算不同位置的路径数量,而不需要保留整个二维数组。dp[i][j]表示走到该位置的路径数量。跟上面差不多,只是遇到障碍物就不去计算。时间复杂度:O(m × n)空间复杂度:O(m × n)空间复杂度:O(n)
2023-10-06 18:38:02 565
原创 【代码随想录第41天】动态规划1
2.递推公式: dp[i] = min(dp[i-1] + cos[i-1], dp[i-2]+cos[i-2]) (可以走一步或两步)2.递推公式: dp[i] = dp[i-1] + dp[i-2], i>1。递推公式:dp[i] = dp[i-2] + dp[i-1]3初始化: dp[0] = 0, dp[1] = 1。初始化:dp[1] = 1, dp[2] = 2;1.dp含义: dp[i]:第i个斐波那契数的值。dp[i]: 到达i阶有dp[i]种方法。1.dp[i]是到达i位置的最小花费。
2023-10-03 02:28:50 119
原创 【代码随想录第37天】 贪心6
从后往前遍历,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9。然后从头遍历字符,更新字符的最远出现位置,如果最远出现位置与当前下标相等,就找到分割点。记录每个字符的最远距离。
2023-10-03 02:10:44 96
原创 【代码随想录第36天】贪心5
先把第一个放进结果集,如果重叠,更新结果集最后一个元素的右边界:res.back()[1]然后从头遍历字符,更新字符的最远出现位置,如果最远出现位置与当前下标相等,就找到分割点。先按左边界排序,然后判断是否重叠,更新下一个i-1的右边界。这题思路跟上一个扎气球的没什么区别。记录每个字符的最远距离。还是先按左边界排完序,
2023-10-03 01:53:12 60
原创 【代码随想录第35天】 贪心4
C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。2.再用K对整个队列进行调整,每个人插入的位置是ki(因为每个人都没有自己前面的人高,所以插到前面时,不会影响插入位置的后面的人排序,保证了k符合要求)所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n。遇到10块,ten++, 找5块,five–
2023-09-25 23:33:17 140
原创 【代码随想录第34天】 贪心3
局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。先那绝对值从大到小排序,然后从前向后遍历,遇到负数将其变为正数,同时K–,若净增的累加小于0,就到不了下一个加油站了,从i + 1开始重新累加。先从左往右遍历,确保分发给每人的糖果数量满足 分数上右边 > 左边。然后从右往左遍历,确保分发的糖果满足 分数上 左边 > 右边。这题思路还挺清晰,先解决一边,再解决另一边。如果遍历完了k没用完,就只修改绝对值最小的。计算每个加油站油量的净增。
2023-09-25 15:44:02 107
原创 【代码随想录第32天】 贪心2
贪心的思想不用管它怎么跳, 只需要维护最大向后覆盖的范围即可,遍历中,若cover覆盖的索引大于等于最后一个下标,就return true。遍历结束没到最后一个值,return false。注意遍历的是它能覆盖到的地方,覆盖不到的地方也就遍历不到。把利润分解为每天相对于前一天的利润,只收集每天为正的利润。每一步尽可能增加覆盖范围,一旦覆盖到终点就输出结果。只记录下一步最大的覆盖范围。
2023-09-24 17:39:47 112
原创 【代码随想录第31天】贪心1
i 指向第一个 2 的时候,prediff > 0 && curdiff = 0 ,当 i 指向最后一个 2 的时候 prediff = 0 && curdiff < 0。贪心的思路:当前子数组和为负数时,就舍弃该数组,重新从下一个值开始记录。外层for循环从大到小遍历胃口,饼干从最大的开始匹配,满足一个胃口,饼干的索引–情况2:首尾元素: 因为循环里要判断3个值,首尾元素要特殊处理。贪心的本质是选择每一阶段的局部最优,从而达到全局最优。思路:尽可能用最大的饼干去匹配最大的胃口。情况1:上下坡有平坡。
2023-09-24 14:35:29 35
原创 【代码随想录第29天】 回溯法5
树层去重: i > 0 && nums[i] == nums[i-1] && used[i-1] == 0。用used数组来标记取过的元素,然后从剩下的元素中取值(i从0遍历,遇到used=1跳过)树枝相等时 nums[i] == nums[i-1] && used[i-1] == 1。全排列终止:path.size()==nums.size()时间复杂度: O(n * 2^n)还是树层去重,其他跟全排列一模一样。空间复杂度: O(n)
2023-09-20 23:23:22 68
原创 【代码随想录第28天】回溯法4
树层去重:i > start && nums[i] == nums[i-1]段位以0为开头的数字不合法-> start=0, start!思路:把收集结果放到for循环里,在每个节点都收集一次结果。段位里有非正整数字符不合法。段位如果大于255了不合法。
2023-09-19 13:28:00 119
原创 【代码随想录第27天】回溯法3
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。
2023-09-18 23:22:53 126
原创 【代码随想录第25天】 回溯法2
返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。终止:path长度等于k,若此时n减到0则收入结果集。宽度就是每个数字对应的字符串长度(for循环)用string数组存储对应数字下标的字符串,每个数字最多使用一次 ,start记录遍历到了第几个数字,剪枝:若i>n就不用继续了。LeetCode题目。
2023-09-16 10:54:08 166
原创 【代码随想录第24天】 回溯法1
将回溯法抽象为树形结构(高度有限的N叉树),在集合中递归查找子集,集合的大小构成了树的宽度,递归的深度构成的树的深度。题目描述:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。n就是树的宽度,k是深度,每次搜到叶子结点就收集结果。子集问题:一个N个数的集合里有多少符合条件的子集。排列问题:N个数按一定规则全排列,有几种排列方式。组合问题:N个数里面按一定规则找出k个数的集合。切割问题:一个字符串按一定规则有几种切割方式。棋盘问题:N皇后,解数独等等。LeetCode题目。
2023-09-15 10:19:57 252
原创 【代码随想录第23天】二叉树9
删除节点的思路很巧妙,直接把结果返回给要删除节点的父节点。代码随想录: 108.将有序数组转换为二叉搜索树。思路:每次从数组中间位置取值。LeetCode题目。
2023-09-14 23:29:56 328 1
原创 【代码随想录第22天】二叉树8
二叉搜索树遍历中,第一个在p, q之间的节点就是最近公共祖先。代码随想录: 701.二叉搜索树中的插入操作。直接用256二叉树最近公共祖先也行。LeetCode题目。直接插到叶子结点方便。
2023-09-14 22:14:02 281 1
原创 【代码随想录第21天】二叉树7
最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)题目描述:给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。注: 遍历中,pre=null时,第一个节点开始计数。代码随想录: [236. 二叉树的最近公共祖先]情况1:root的左子树有p,右子树有q。情况2:p是q的祖先,或q是p的祖先。
2023-09-12 00:26:36 428
原创 【代码随想录第20天】二叉树6
题目描述:给定一个不重复的整数数组 nums。用一个max记录中序遍历中当前节点之前的最大节点,以此判断是否有序。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。直观方法:二叉树中序遍历为数组,然后判断数组是否有序。创建一个根节点,其值为 nums 中的最大值。返回 nums 构建的 最大二叉树。陷阱在于不能只比较左节点<中间<右节点。
2023-09-11 13:47:05 348
原创 【代码随想录第18天】二叉树5
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。层序遍历很简单,记录最后一层队头的元素,循环结束返回即可。终止条件:到达叶子,更新最大深度和结果。写的时候把数组大小为0判断给忘了。
2023-09-09 15:35:56 507 1
原创 【代码随想录第17天】二叉树4
第一想法:左叶子:root->left &&!代码随想录:404.左叶子之和。递归比较左右子树的高度差。sum可以设置为全局变量。到叶子节点时收集结果。
2023-09-08 15:54:52 554 1
原创 【代码随想录第15天】二叉树2
可以先用类似前序遍历的方式,实现中->右->左的遍历,然后把遍历结果反转即可得到左->右->中的后序遍历。中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。(因为栈是后进先出,每次处理栈顶的元素,要保证处理顺序是中->左->右)前中后序递归方法大同小异,都比较简单。代码随想录: 144.前序遍历。
2023-09-05 19:53:38 766
原创 【代码随想录第13天】|栈与队列3
题目描述:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。题目描述:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。pop时,比较当前要pop的值是否等于队头元素,等于则弹出,然后可以push后一位了。push时,将队内小于val的所有元素弹出(从back往前遍历)构造一个单调减队列,维护滑动窗口的最大值永远在队头。返回 滑动窗口中的最大值。
2023-09-05 01:12:43 701
原创 【代码随想录第11天】栈与队列2
思路: 遍历字符串时,分别把与左括号对应的右括号压栈,遇到右括号时匹配栈顶,若此时栈空了或者不匹配,则return false。题目描述:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。题目描述:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。题目描述:给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。1.有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’。返回一个表示表达式值的整数。
2023-09-02 00:20:16 842
原创 【代码随想录第10天】栈与队列1
c++的栈和队列属于容器适配器,不允许有遍历行为,不提供迭代器。底层实现可以有多种,默认是deque双向队列。我们也可以指定vector为栈的底层实现:刚刚讲过栈的特性,对应的队列的情况是一样的。队列中先进先出的数据结构,同样, SGI STL中队列一样是以deque为缺省情况下的底部结构。也可以指定list为底层实现,初始化:232.用栈实现队列实现 MyQueue 类:思路:两个栈,一个输入栈,一个输出栈push的时候,数据放进输入栈。pop的时候,若输出栈不为空,直接弹出栈顶即可。若输
2023-08-31 23:17:16 1001
原创 【代码随想录第9天】KMP
相当于[0, j]与[1,i]做模式匹配,不匹配则跳转到前一位的next数组,不匹配再跳转,直到匹配或者j=0。当字符串不匹配时,寻找前一位置的next数组值,跳转过去。前缀:以第1个字符开头,不包含最后一个字符的连续子串;我的代码next数组就是前缀表,没有右移,也没有-1.后缀:以最后一个字符结尾,不包含第1个字符的连续子串。i: 要求的当前位置next[i],是后缀的末尾。j:是前缀末尾,也是最长相等前后缀的长度。getNext函数中,KMP思路:求前缀表。
2023-08-31 22:24:07 977
原创 【代码随想录第8天】字符串1
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。题目描述:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。题目描述:编写一个函数,其作用是将输入的字符串反转过来。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
2023-08-30 00:59:05 1170
原创 【代码随想录第7天】哈希表2
题目描述:给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。题目描述:给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。思路:先对整个数组排序,用i作为三元组的第一个数,left和right分别从i的右侧查询,注意:答案中不可以包含重复的三元组。比三数之和多一层循环。
2023-08-29 00:00:48 1292 1
原创 【代码随想录第6天】哈希表1
当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,map存放的就是访问过的元素。题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。如果这个过程 结果为 1,那么这个数就是快乐数。
2023-08-28 00:59:05 1541 1
原创 【代码随想录第4天】链表2
为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。快慢指针,fast步长为2,slow步长为1,若有环则fast和slow必相遇,且相遇位置到环入口的距离等于链表头结点到环入口的距离。题目描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
2023-08-26 15:17:51 1591
原创 【代码随想录第2天】数组2
题目描述:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。滑动窗口:不断调整子序列的起始终止位置来求结果,for循环表示的是终止位置。可以将种类和个数映射到哈希表上,用一个键值对来表示一个种类的水果有多少个。这题和上面的区别是,上一题是方阵。
2023-08-24 18:50:28 1885
原创 【代码随想录第1天】数组1
数组为有序数组,且数组中无重复元素。二分查找,保证循环中区间定义始终不变即可(下为左闭右开)不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。移除所有数值等于 val 的元素,并返回移除后数组的新长度。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。给你一个数组 nums 和一个值 val,你需要。快指针:寻找新数组的元素 ,遇到target跳过。慢指针:新数组的下标。时间复杂度:O(n)空间复杂度:O(1)
2023-08-23 17:43:26 1947 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人