- 博客(64)
- 收藏
- 关注
原创 15. 三数之和 - 力扣(LeetCode)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]注意,输出的顺序和三元组的顺序并不重要。你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。
2024-02-20 14:59:00 551
原创 18. 四数之和 - 力扣(LeetCode)
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。你可以按 任意顺序 返回答案。a、b、c 和 d 互不相同。
2024-02-20 14:49:50 713
原创 987. 二叉树的垂序遍历 - 力扣(LeetCode)
如果当前遍历到的节点的列号 col 与 lastcol 相等,则将该节点放入与上一个节点相同的数组中,否则放入不同的数组中。对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1)。二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。输出:[[4],[2],[1,5,6],[3],[7]]输入:root = [1,2,3,4,5,6,7]
2024-02-13 19:20:05 637
原创 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输出:[3,9,20,null,null,15,7]
2024-02-09 18:28:10 730
原创 236. 二叉树的最近公共祖先 - 力扣(LeetCode)
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。从底至顶回溯,当节点 p,q 在节点 root 的异侧时,节点 root 即为最近公共祖先,则向上返回 root。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。解释:节点 5 和节点 1 的最近公共祖先是节点 3。
2024-02-09 11:15:58 703
原创 513. 找树左下角的值 - 力扣(LeetCode)
在深度优先搜索时,我们先搜索当前节点的左子节点,再搜索当前节点的右子节点,然后判断当前节点的深度 depth 是否大于 maxDepth,如果是,那么将 result 设置为当前结点的值,maxDepth 设置为 depth。在遍历一个节点时,需要先把它的非空右子节点放入队列,然后再把它的非空左子节点放入队列,这样才能保证从右到左遍历每一层的节点。由于我们总是先遍历左节点,再遍历右节点,所以我们可以保证我们每一次更新的最大深度时总是在当前层中的最左侧,记录的是最大深度最左侧节点的值。
2024-02-08 19:06:23 751
原创 993. 二叉树的堂兄弟节点 - 力扣(LeetCode)
然后对当前节点的左右子节点分别调用函数 dfs,其中父节点为当前节点,深度为当前深度加 1。我们设计一个函数 dfs(root,parent,depth),表示从根节点 root 出发,其父节点为 parent,深度为 depth,进行深度优先搜索。每次从队列中取出一个节点,如果该节点的值为 x 或 y,则记录该节点的父节点和深度。如果该节点的左右子节点不为空,则将左右子节点和该节点放入队列中。当队列中所有节点都处理完毕后,如果 x 和 y 的深度相同且父节点不同,则返回 true,否则返回 false。
2024-02-08 12:59:26 805
原创 222. 完全二叉树的节点个数 - 力扣(LeetCode)
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。输入:root = [1,2,3,4,5,6]
2024-02-07 17:50:25 514
原创 101. 对称二叉树 - 力扣(LeetCode)
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!输入:root = [1,2,2,3,4,4,3]比较的是两个子树的里侧和外侧的元素是否相等。
2024-02-07 16:55:27 580
原创 2641. 二叉树的堂兄弟节点 II - 力扣(LeetCode)
题目要求将二叉树中每个节点的值替换为所有堂兄弟节点的和,而堂兄弟节点就是指那些和当前节点深度相同但父节点不同的节点。在广度优先搜索的过程中,通过第 n−1 层去遍历第 n 层的节点时,可以顺便统计第 n 层节点的和 sum。由于更新 x 的值时需要知道 y 的值(有可能不存在),因此需要通过 n−1 层对第 n 层进行第二次遍历,这时就可以使用 sum−x−y 更新 x 的值了。给你一棵二叉树的根 root ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和。
2024-02-07 15:50:05 729
原创 LCP 30. 魔塔游戏 - 力扣(LeetCode)
当计算完第 i 个房间的生命值影响后,如果生命值小于等于 0,那么我们取出堆顶元素,表示将该房间调整至末尾,并将其补回生命值中。假定小扣原计划按房间编号升序访问所有房间补血/打怪,为保证血量始终为正值,小扣需对房间访问顺序进行调整,每次仅能将一个怪物房间(负数的房间)调整至访问顺序末尾。对于所有可选的房间,无论将哪个房间调整至末尾,都不会改变最终的生命值(因为数组 nums 的和不会变化)。当所有房间遍历完成后,我们还需要将所有从堆中取出元素的和重新加入生命值,如果生命值小于等于 0,说明无解。
2024-02-06 13:49:40 837
原创 738. 单调递增的数字 - 力扣(LeetCode)
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增。输入: n = 332。
2024-01-29 18:46:20 551
原创 56. 合并区间 - 力扣(LeetCode)
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输出:[[1,6],[8,10],[15,18]]
2024-01-27 19:48:49 639
原创 763. 划分字母区间 - 力扣(LeetCode)
我们使用一个数组来记录每个字母出现的最远位置,然后使用 跳跃游戏II 的策略,滑动窗口的思想。我们不断遍历目标字符串每个字符出现的最远位置,不断更新右边界(右边界就是最远位置),如果到了右边界就将区间长度加入结果集(代表到了分割点),然后使得左边界加1,继续使用滑动窗口更新右边界。像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。返回一个表示每个字符串片段的长度的列表。
2024-01-26 17:30:16 556
原创 435. 无重叠区间 - 力扣(LeetCode)
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。返回 需要移除区间的最小数量,使剩余区间互不重叠。将数组按照左边界或者右边界从小到大排序,目的是为了将容易重叠的区间放在一块,本题解采用左边界排序。输入: intervals = [[1,2],[2,3],[3,4],[1,3]]解释: 移除 [1,3] 后,剩下的区间没有重叠。
2024-01-26 15:18:40 768
原创 452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。可以射出的弓箭的数量 没有限制。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。输入:points = [[10,16],[2,8],[1,6],[7,12]]-在x = 6处射出箭,击破气球[2,8]和[1,6]。
2024-01-26 14:33:05 604
原创 406. 根据身高重建队列 - 力扣(LeetCode)
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
2024-01-26 11:02:42 527
原创 860. 柠檬水找零 - 力扣(LeetCode)
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
2024-01-25 16:16:55 459
原创 135. 分发糖果 - 力扣(LeetCode)
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。输入:ratings = [1,0,2]输入:ratings = [1,2,2]
2024-01-25 15:42:52 546
原创 134. 加油站 - 力扣(LeetCode)
我们从头开始遍历数组的剩余油量并计算区间的总和,如果遇到负数了,说明从该区间的任何位置开始都到达不了该点,所以我们贪心策略是要从下一个位置开始重新计算区间总和,只有这样才可能到达一圈。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
2024-01-25 14:58:11 684
原创 1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。使用贪心算法,两次贪心策略解决该题,首先将数组按照绝对值从大到小排序,然后进行以下两次贪心策略。解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。以这种方式修改数组后,返回数组可能的最大和。输入:A = [4,2,3], K = 1。最后将取反完成的数组取总和返回结果。
2024-01-25 12:56:42 480
原创 45. 跳跃游戏 II - 力扣(LeetCode)
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。你的目标是使用最少的跳跃次数到达数组的最后一个位置。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。输入: [2,3,1,1,4]
2024-01-24 16:31:06 563
原创 122. 买卖股票的最佳时机 II - 力扣(LeetCode)
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。输入: [7,1,5,3,6,4]
2024-01-24 16:09:46 328
原创 55. 跳跃游戏 - 力扣(LeetCode)
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。输入:nums = [2,3,1,1,4]判断你是否能够到达最后一个位置。
2024-01-24 16:07:01 538
原创 376. 摆动序列 - 力扣(LeetCode)
例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。少于两个元素的序列也是摆动序列。给定一个整数序列,返回作为摆动序列的最长子序列的长度。解释:整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3)。输入:nums = [1,7,4,9,2,5]
2024-01-24 15:12:00 623
原创 455. 分发饼干 - 力扣(LeetCode)
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
2024-01-24 11:56:34 436
原创 贪心算法理论基础
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。说实话贪心算法并没有固定的套路。那么如何能看出局部最优是否能推出整体最优呢?
2024-01-24 11:30:31 730
原创 51. N 皇后 - 力扣(LeetCode)
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
2024-01-23 14:46:38 764
原创 90. 子集 II - 力扣(LeetCode)
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
2024-01-23 12:46:15 649
原创 491. 非递减子序列 - 力扣(LeetCode)
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
2024-01-23 12:43:21 566
原创 93. 复原 IP 地址 - 力扣(LeetCode)
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你可以按 任何 顺序返回答案。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
2024-01-22 19:20:16 469
原创 40. 组合总和 II - 力扣(LeetCode)
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次。注意:解集不能包含重复的组合。
2024-01-22 15:47:42 442
原创 131. 分割回文串 - 力扣(LeetCode)
我们使用回溯、深度优先遍历的思想,使用 ans 记录路径,使用 ret 记录路径组合结果,使用 f 数组记录是否回文,使用 n 记录字符串总数量。给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。
2024-01-20 20:15:42 534
原创 77. 组合 - 力扣(LeetCode)
我们使用回溯、深度优先遍历的思想,我们使用一个栈 path 来记录走过的路径,使用 begin 来记录当前来到的数字位置。给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。
2024-01-20 14:17:55 503
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人