- 博客(30)
- 收藏
- 关注
原创 算法训练第30天|46. 携带研究材料(01背包问题)|416. 分割等和子集
先讲一下01背包问题:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。这道题目如果使用暴力解法,即回溯法来做的话,时间复杂度很大,,n表示物品的数量。如果使用动态规划的方法来做:1、确定dp数组以及下标的含义我们需要使用二维数组的两个维度分别表示,物品 和 背包容量,即dp[i][j]。i 来表示物品、j表示背包容量2、确定递推公式。
2024-09-03 14:54:57 1743
原创 算法训练第29天|62.不同路径|63. 不同路径 II
那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。
2024-09-02 10:41:55 1644
原创 算法训练第28天|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯
一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。dp[i]的定义:到达第i台阶所花费的最少花费为dp[i]
2024-08-31 13:34:28 892
原创 算法训练第26天|452. 用最少数量的箭引爆气球|435. 无重叠区间|763.划分字母区间
【代码】算法训练第26天|452. 用最少数量的箭引爆气球|435. 无重叠区间|763.划分字母区间。
2024-08-30 14:40:43 204
原创 算法训练第25天|134. 加油站|135. 分发糖果|860.柠檬水找零|406.根据身高重建队列
【代码】算法训练第25天|134. 加油站|135. 分发糖果|860.柠檬水找零|406.根据身高重建队列。
2024-08-28 15:01:21 253
原创 算法训练第24天|122.买卖股票的最佳时机II|55. 跳跃游戏|45.跳跃游戏II|1005.K次取反后最大化的数组和
【代码】算法训练第24天|122.买卖股票的最佳时机II|55. 跳跃游戏|45.跳跃游戏II|1005.K次取反后最大化的数组和。
2024-08-27 16:46:03 253
原创 算法训练第23天|455.分发饼干|376. 摆动序列|53. 最大子序和
题目描述:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列。局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。
2024-08-26 14:53:09 641
原创 算法训练第22天|491.递增子序列|46.全排列|47.全排列 II
本题目需要考虑去重,但是不能像以往那样处理,因为该数组不能排序,所以不能使用Used数据标记是否使用过,所以使用map来处理。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。,找出并返回所有该数组中不同的递增子序列,递增子序列中。题目描述:给定一个可包含重复数字的序列。题目描述:给定一个不含重复数字的数组。本题相对于上一题,需要考虑去重。题目描述:给你一个整数数组。返回所有不重复的全排列。
2024-08-24 17:37:17 288
原创 算法训练第21天|93.复原IP地址|78.子集|90.子集II|深信服笔试题
其中可能包含重复元素,请你返回该数组所有可能的。,用以表示一个 IP 地址,返回所有可能的。返回的解集中,子集可以按。正好由四个整数(每个整数位于。之间组成,且不能含有前导。给定一个只包含数字的字符串。题目描述:给你一个整数数组。返回该数组所有可能的。,这些地址可以通过在。
2024-08-23 14:11:30 298
原创 算法训练第20天|39. 组合总和|40.组合总和II|131.分割回文串
还可以进行剪枝操作,对总集合排序之后,如果下一层的sum(就是本层的 sum + candidates[i])已经大于target,就可以结束本轮for循环的遍历。所以在 backtracking(candidates, target, sum+candidates[i], i)中,传入的就是i,不能是i+1。如果至少一个数字的被选数量不同,则两种组合是不同的。题目描述:给定一个候选人编号的集合。中的每个数字在每个组合中只能使用。中可以使数字和为目标数。对于给定的输入,保证和为。解集不能包含重复的组合。
2024-08-22 14:27:34 763
原创 算法训练第19天|77. 组合|216.组合总和III|17.电话号码的字母组合
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。该列表不能包含相同的组合两次,组合可以以任何顺序返回。的字符串,返回所有它能表示的字母组合。使用map来记录数字对应的字母串。题目描述:找出所有相加之和为。题目描述:给定一个仅包含数字。题目描述:给定两个整数。本题是回溯法的经典题目。所有可能的有效组合的列表。
2024-08-21 11:34:44 532
原创 算法训练第18天|669. 修剪二叉搜索树|108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树
改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。通过修剪二叉搜索树,使得所有节点的值在。题目中说要转换为一棵高度平衡二叉搜索树,题目描述:给你二叉搜索树的根节点。的新值等于原树中大于或等于。题目描述:给你一个整数数组。排列,请你将其转换为一棵。
2024-08-20 11:14:14 256
原创 算法训练第17天|235. 二叉搜索树的最近公共祖先|701.二叉搜索树中的插入操作|450.删除二叉搜索树中的节点
题目描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(因为是有序树,所以如果中间节点是 q 和 p 的公共祖先,那么中间节点的数组 一定是在 [p, q]区间的。本题是二叉搜索树,二叉搜索树是有序的,在有序树里,如何判断一个节点的左子树里有p,右子树里有q呢?题目描述:给定二叉搜索树(BST)的根节点。题目描述:给定一个二叉搜索树的根节点。
2024-08-19 13:37:30 773
原创 算法训练第16天|530.二叉搜索树的最小绝对差|501.二叉搜索树中的众数|236. 二叉树的最近公共祖先
最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。,找出并返回 BST 中的所有众数(即,出现频率最高的元素)。后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。题目描述:给你一个含重复值的二叉搜索树(BST)的根节点。
2024-08-17 16:08:01 350
原创 算法训练第15天|654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;返回以该节点为根的子树。二叉搜索树的中序遍历是一个顺序数组,所以利用这个做这道题目。null 的节点将直接作为新二叉树的节点。题目描述:给定二叉搜索树(BST)的根节点。,判断其是否是一个有效的二叉搜索树。题目描述:给定一个不重复的整数数组。合并过程必须从两个树的根节点开始。题目描述:给你一个二叉树的根节点。返回合并后的二叉树。
2024-08-16 15:28:29 275
原创 算法训练第14天|513.找树左下角的值|112. 路径总和|113. 路径总和ii|106.从中序与后序遍历序列构造二叉树|105.从前序与中序遍历序列构造二叉树
可以使用深度优先遍历的方式(本题前中后序都可以,无所谓,因为中节点也没有处理逻辑)来遍历二叉树。使用层序遍历简单些,层序遍历后,拿到最后一层的第一个元素。的路径,这条路径上所有节点值相加等于目标和。是同一棵树的后序遍历,请你构造并返回这颗。路径总和等于给定目标和的路径。题目描述:给你二叉树的根节点。题目描述:给你二叉树的根节点。题目描述:给定一个二叉树的。题目描述:给定两个整数数组。,请构造二叉树并返回其根节点。和一个表示目标和的整数。是指没有子节点的节点。是指没有子节点的节点。是二叉树的中序遍历,
2024-08-15 15:36:39 425
原创 算法训练第13天|110.平衡二叉树|257. 二叉树的所有路径|404.左叶子之和
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。,返回所有从根节点到叶子节点的路径。题目描述:给你一个二叉树的根节点。题目描述:给定二叉树的根节点。是指没有子节点的节点。
2024-08-15 15:10:26 310
原创 算法训练第12天|226.翻转二叉树|101. 对称二叉树|104.二叉树的最大深度|111.二叉树的最小深度
本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。题目描述:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了。是指从根节点到最远叶子节点的最长路径上的节点数。题目描述:给你一棵二叉树的根节点。题目描述:给你一个二叉树的根节点。
2024-08-13 09:32:35 388
原创 算法训练第11天|144.二叉树的前序遍历|145.二叉树的后序遍历|94.二叉树的中序遍历及其应用
层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。这道题目说是二叉树,但116题目说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑一样的味道。使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
2024-08-12 13:15:21 724
原创 算法训练第10天|150. 逆波兰表达式求值|239. 滑动窗口最大值|347.前 K 个高频元素
平常生活中我们常见的算式一般都是中缀表达式,但是计算机计算时,一些括号、乘除等操作带来计算优先级,会给计算增加负担。思路:遇到数字则放入栈中,如果遇到计算符号,则将2个元素从数组中拿出,进行相应的计算,然后再放入栈中。sort.Slice()函数是Go语言中一个非常有用的排序函数。暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样时间复杂度为O(n × k)。保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。的滑动窗口从数组的最左侧移动到数组的最右侧。
2024-08-12 12:18:47 347
原创 算法训练第9天|232. 用栈实现队列|225. 用队列实现栈|20. 有效的括号|1047. 删除字符串中的所有相邻重复项
具体过程为:元素先进入其中一个队列中(queue2),如果此时另一队列为空时(queue1),交换queue1和queue2,此时queue1不为空,queue2为空。如果另个一队列不为空时(queue1),则将queue1中的元素依次添加到queue2的队列中,然后交换两个队列,此时queue1不为空,queue2为空。使用两个栈模拟队列,当队列执行pop()操作时,元素先进入一个栈中,然后再依次出栈放到另一个栈中,然后在依次出栈,这样可以模拟队列的pop()操作。思路:遍历字符串,并用切片接受。
2024-08-09 10:45:44 847
原创 算法训练第8天|151.翻转字符串里的单词|卡码网:55.右旋转字符串
题目描述:字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。思路其实与上一题的思路一致,先整体翻转,然后在局部翻转。中使用至少一个空格将字符串中的。
2024-08-08 12:08:34 320
原创 算法训练第7天|344.反转字符串|541. 反转字符串II|卡码网:54.替换数字
题目描述:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。如果想把这道题目做到极致,就不要只用额外的辅助空间了。不要给另外的数组分配额外的空间,你必须。,从字符串开头算起,每计数至。个,则将剩余字符全部反转。题目描述:给定一个字符串。
2024-08-07 12:22:04 333
原创 算法训练第6天|454.四数相加II|383. 赎金信|15. 三数之和|18. 四数之和
例如数组的元素为:[-1,-1,-1,1,1,1,1,1,2,2,2,2],初始时,a为第一个-1,b为第二个-1,c为最后一个2,满足条件[-1, -1, 2]。后续遍历时,当b==-1时,要持续往后移动,当c==2时,要持续往前移动。当遍历到第一个-1时,同时判断第二个数组元素也为-1,则直接跳过{-1,-1, 2},显然不合理。如果使用if nums[i] == nums[i-1]{跳过},当遍历到第一个-1时,不会进行操作,后续b和c会继续进行遍历,然后进行a+b+c==0的判断。
2024-08-06 16:00:45 574
原创 算法训练第5天|242.有效的字母异位词|349. 两个数组的交集|202. 快乐数|1. 两数之和
在遍历的过程中,preIndex, ok := m[target - val]表示对应的值是否在之前遍历过,如果遍历过,preIdex返回下标值,ok返回true,否则,ok返回false。本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,故使用map来解决该问题,key表示数组中的元素,value表示的是其对应的下标。(这个可以作为一个突破口,当判断一个数是否为快乐数时,如果该数之前访问过,则判断不是快乐数)。但是在计算过程中,数值是一直变化的,如何判断该数之前访问过是思考的重点。
2024-08-05 12:01:54 527
原创 算法训练第四天|24. 两两交换链表中的节点|19.删除链表的倒数第N个节点|02.07. 链表相交|142.环形链表II
写代码时要注意一点,为了删除节点方便,通常会遍历到要删除的节点的前一个节点,所以,fast先移动时,要多走一步。双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。在相同的时间内,fast指针走过的节点数是slow指针走过的节点数的2倍,故有如下的式子:2 * (x + y) = x + y + n*(y + z)。再从n * (y+z)中提出一个 (y+z)来,整理公式之后为如下公式:x = (n - 1)(y + z) + z。
2024-08-03 14:43:38 1564
原创 算法训练第三天|203.移除链表元素|707.设计链表|206.反转链表
这道题考察的都是一些基础,比如:链表结构体的定义、结构体的实例化、如何移动指针、索引条件的判断、链表节点增删。如果不使用虚拟头结点,则第一个节点的移除和其他节点的移除,代码写起来不一致,需要单独考虑。,请你反转链表,并返回反转后的链表。题目描述:给你一个链表的头节点。题目描述:给你单链表的头节点。请你删除链表中所有满足。
2024-08-02 13:27:18 363
原创 算法训练第二天| 209.长度最小的子数组| 59.螺旋矩阵II
在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。滑动窗口可以使用一个for循环来解决暴力解法中的双for循环,但是要考虑滑动窗口中的for循环是作为窗口的起始位置还是终点位置。假设把滑动窗口中的for循环作为起始位置,当每次确认窗口大小时,终点指针必须要遍历一遍数组,这样做和暴力解法没有区别。所有元素,且元素按顺时针顺序螺旋排列的。个正整数的数组和一个正整数。题目描述:给你一个正整数。题目描述:给定一个含有。
2024-08-01 19:17:44 292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人