自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 CSAPP | Lab2-Bomb Lab详细解析

邪恶的邪恶博士在我们班的机器上安放了大量的“二元炸弹”。二进制炸弹是一个由一系列阶段组成的程序。每个阶段都要求你在 stdin 上键入一个特定的字符串。如果你键入了正确的字符串,那么这个阶段就会被拆除,炸弹就会进入下一个阶段。否则,炸弹会通过打印“ BOOM 然后终止。当每个阶段都被拆除时,炸弹就会被拆除。我们要处理的炸弹太多了,所以我们给每个学生一个炸弹去拆除。你们的任务,你们别无选择,只能接受,就是在due date前拆除炸弹。祝你好运,欢迎加入拆弹小组!

2024-04-24 13:53:42 1895 1

原创 一刷总结 | 完成比完美更重要(〃‘▽‘〃)

神奇的是就这么跟着一天一天地打卡居然也磕磕绊绊地完成了,中间没有任何的痛苦不适或者是难以坚持的情绪,到最开始一天两三个甚至三四个小时,到后期的一天有时候控制在一个小时内就能昨晚+写博客,刷题越来越顺畅。向来都不是一个执行里很强的人,更多的时候为知识付费也就真的只是为知识付费了,于是这一次在开始之前我就告诉自己,不管是认真完成还是稍微摸鱼一定要坚持走完这六十天。虽然我清楚地知道最开始刷的题以及知识点很多可能都记不住了, 但有了这一遍的基础之后再刷就会容易很多,之后只需要再巩固加补充就好了。

2024-04-22 12:41:13 221

原创 刷题DAY60 | LeetCode 84-柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。求在该柱状图中,能够勾勒出来的矩形的最大面积。

2024-04-22 12:08:59 1073 4

原创 刷题DAY59 | LeetCode 503-下一个更大元素II 42-接雨水

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素。数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

2024-04-21 20:19:57 1163 3

原创 刷题DAY58 | LeetCode 739-每日温度 496-下一个更大元素 I

更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。即:如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。什么时候用单调栈呢?

2024-04-18 08:49:35 1044

原创 LeetCode刷题总结 | 图论3—并查集

并查集理论基础1.背景首先要知道并查集可以解决什么问题呢?并查集常用来解决连通性问题。大白话就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。并查集主要有两个功能:将两个元素添加到一个集合中。判断两个元素在不在同一个集合接下来围绕并查集的这两个功能来展开讲解。2.原理讲解从代码层面,我们如何将两个元素添加到同一个集合中呢。可能会想到:可以把他放到同一个数组里或者set 或者 map 中,这样就表述两个元素在同一个集合。那么问题来了,对这些元素分门别类,可不止

2024-04-17 17:07:22 2392

原创 LeetCode刷题总结 | 图论2—深度优先搜索&广度优先搜索较为复杂应用

计算这个岛屿的周长。当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。当然这里还有一个优化的点,就是 可以不用 visited数组,因为有mark来标记,所以遍历过的grid[i][j]是不等于1的。其实这是一个误区,大家再自己看 dfs函数的实现,其实 有visited函数记录 走过的节点,而走过的节点是不会再走第二次的。,那么整体时间复杂度 就是$ O(m^2 * n^2) $,这是一个四次方的时间复杂度,显然没有进行任何优化,大概率会超时。

2024-04-17 15:47:11 1280

原创 LeetCode刷题总结 | 图论1—深度优先搜索&广度优先搜索&一些简单套模板问题

通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。一般情况,深搜需要二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局变量,避免让我们的函数参数过多。

2024-04-17 13:52:18 2348

原创 刷题DAY57 | LeetCode 647-回文子串 516-最长回文子序列

如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。首先从递推公式中可以看出,情况三是根据dp[i + 1][j - 1]是否为true,在对dp[i][j]进行赋值true的。

2024-04-17 09:28:18 1171

原创 刷题DAY56 | LeetCode 583-两个字符串的删除操作 72-编辑距离

基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。每步 可以删除任意一个字符串中的一个字符。

2024-04-16 09:26:49 321

原创 刷题DAY55 | LeetCode 392-判断子序列 115-不同的子序列

和 dp[i][j] = dp[i - 1][j];= t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]所以递推公式为:dp[i][j] = dp[i - 1][j];

2024-04-15 10:57:45 720

原创 刷题DAY53 | LeetCode 1143-最长公共子序列 1035-不相交的线 53-最大子序和

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

2024-04-12 22:28:55 570

原创 刷题DAY52 | LeetCode 300-最长递增子序列 674-最长连续递增序列 718-最长重复子数组

如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要进行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。举个例子A[0]如果和B[0]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。

2024-04-12 13:23:54 1044

原创 刷题DAY51 | LeetCode 309-最佳买卖股票时机含冷冻期 714-买卖股票的最佳时机含手续费

如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么 dp[0][1] (即第0天的状态二)只能初始为0。那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);整数 fee 代表了交易股票的手续费用。今天卖出了股票(状态三),同上分析,dp[0][2]初始化为0,dp[0][3]也初始为0。

2024-04-12 11:57:53 700

原创 刷题DAY50 | LeetCode 123-买卖股票的最佳时机III 188-买卖股票的最佳时机IV

例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])你最多可以完成 k 笔交易。那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?

2024-04-10 12:23:14 1078

原创 刷题DAY49 | LeetCode 121-买卖股票的最佳时机 122-买卖股票的最佳时机II

那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);注意这里说的是“持有”,“持有”不代表就是当天“买入”!

2024-04-09 17:41:32 1275

原创 刷题DAY48 | LeetCode 198-打家劫舍 213-打家劫舍II 337-打家劫舍III

同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

2024-04-08 10:49:48 1192

原创 刷题DAY46 | LeetCode 139-单词拆分 多重背包问题

现在有 N 种不同类型的矿石,每种矿石有一个重量 w[i],一个价值 v[i],以及最多 k[i] 个可用。对于多重背包,有N种物品和一个容量为V 的背包。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。在这个行星上,有许多不同类型的矿石资源,每种矿石都有不同的重要性和价值。如果物品数量很多的话,C++中,这种操作十分费时,主要消耗在vector的动态底层扩容上。输入共包括四行,第一行包含两个整数 C 和 N,分别表示宇航舱的容量和矿石的种类数量。背包最大重量为10。

2024-04-07 09:55:53 743

原创 刷题DAY45 | 70-爬楼梯(进阶) LeetCode 322-零钱兑换 279-完全平方数

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。计算并返回可以凑成总金额所需的 最少的硬币个数。给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。每次你可以爬至多m (1 <= m < n)个台阶。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。需要 n 阶你才能到达楼顶。输出一个整数,表示爬到楼顶的方法数。你可以认为每种硬币的数量是无限的。

2024-04-06 19:19:47 548

原创 刷题DAY44 | 完全背包问题 LeetCode 518-零钱兑换 II 377-组合总和 Ⅳ

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。依然举这个例子:背包最大重量为4。问背包能背的物品最大价值是多少?和完全背包唯一不同就是体现在遍历顺序上回顾一下01背包的核心代码我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。

2024-04-04 12:12:19 1125

原创 刷题DAY43 | LeetCode 1049-最后一块石头的重量 II 494-目标和 474-一和零

其实 此时最终的dp[0] = 32,也就是这五个零 子集的所有组合情况,但此dp[0]非彼dp[0],dp[0]能算出32,其基础是因为dp[0] = 1 累加起来的。其实也可以使用二维dp数组来求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。

2024-04-03 12:51:27 1210

原创 刷题DAY42 | 01背包问题二维数组 01背包问题一维滚动数组 LeetCode 416-分割等和子集

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。举一个例子:背包最大重量为4。问背包能背的物品最大价值是多少?以下讲解和图示中出现的数字都是以这个例子为例。

2024-04-03 11:29:20 961

原创 刷题DAY41 | LeetCode 343-整数拆分 96-不同的二叉搜索树

那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。

2024-04-03 09:39:32 781

原创 刷题DAY39 | LeetCode 62-不同路径 63-不同路径 II

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。

2024-03-30 10:08:19 226

原创 刷题DAY38 | LeetCode 509-斐波那契数 70-爬楼梯 746-使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。F(n) = F(n - 1) + F(n - 2),其中 n > 1。每次你可以爬 1 或 2 个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。需要 n 阶你才能到达楼顶。给定 n ,请计算 F(n)。

2024-03-29 18:25:01 337

原创 刷题DAY37 | LeetCode 738-单调递增的数字 968-监控二叉树

题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。这一点如果想清楚了,这道题就好办了。此时是从前向后遍历还是从后向前遍历呢?

2024-03-28 10:32:01 929

原创 刷题DAY36 | LeetCode 435-无重叠区间 763-划分字母区间 56-合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

2024-03-27 13:10:06 379

原创 刷题DAY35 | LeetCode 860-柠檬水找零 406-根据身高重建队列 452-用最少数量的箭引爆气球

但使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

2024-03-27 11:42:09 959

原创 刷题DAY34 | LeetCode 1005-K次取反后最大化的数组和 134-加油站 135-分发糖果

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。所以就取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,candyVec[i]只有取最大的才能既保持对左边candyVec[i - 1]的糖果多,也比右边candyVec[i + 1]的糖果多。

2024-03-27 10:05:42 657

原创 刷题DAY32 | LeetCode 122-买卖股票的最佳时机II 55-跳跃游戏 45-跳跃游戏II

其精髓在于控制移动下标 i 只移动到 nums.size() - 2 的位置,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!针对于方法一的特殊情况,可以统一处理,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。最后的步数就是最少步数。图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!

2024-03-23 11:05:28 747

原创 刷题DAY31 | LeetCode 455-分发饼干 376-摆动序列 53-最大子序和

在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果prediff < 0 && curdiff > 0 或者 prediff > 0 && curdiff < 0 此时就有波动就需要统计。相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。它的摇摆序列长度是多少呢?

2024-03-23 09:50:37 794

原创 刷题DAY30 | LeetCode 332-重新安排行程 51-N皇后 37-解数独

332 重新安排行程(hard)给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前。假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且

2024-03-21 17:25:41 707

原创 CSAPP | Lab1-Data Lab 详细解析

CSAPP Lab1-DataLab详细解析

2024-03-21 12:41:02 1072

原创 刷题DAY29 | LeetCode 491-递增子序列 46-全排列 47-全排列 II

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素。你可以按 任意顺序 返回答案。给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。你可以 按任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

2024-03-20 19:56:37 260

原创 刷题DAY28 | LeetCode 93-复原IP地址 78-子集 90-子集II

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。终止条件和131.分割回文串 (opens new window)情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。回溯的时候,就将刚刚加入的分隔符. 删掉就可以了,pointNum也要-1。解集 不能 包含重复的子集。

2024-03-20 18:34:40 892

原创 刷题DAY27 | LeetCode 39-组合总和 40-组合总和II 131-分割回文串

为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。,就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]。都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。

2024-03-20 16:04:42 945

原创 刷题DAY25 | LeetCode 216-组合总和III 17-电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

2024-03-16 14:21:20 482

原创 刷题DAY24 | LeetCode 77-组合

本篇我们讲解了,什么是回溯算法,知道了回溯和递归是相辅相成的。接着提到了回溯法的效率,回溯法其实就是暴力查找,并不是什么高效的算法。然后列出了回溯法可以解决几类问题,可以看出每一类问题都不简单。最后我们讲到回溯法解决的问题都可以抽象为树形结构(N叉树),并给出了回溯法的模板。77 组合(medium)给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。本题是回溯法的经典题目。

2024-03-16 14:11:08 1018

原创 刷题DAY22 | LeetCode 235-二叉搜索树的最近公共祖先 701-二叉搜索树中的插入操作 450-删除二叉搜索树中的节点

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

2024-03-13 16:11:04 351

原创 刷题DAY21 | LeetCode 530-二叉搜索树的最小绝对差 501-二叉搜索树中的众数 236-二叉树的最近公共祖先

在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。

2024-03-13 13:59:46 804

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除