![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode刷题笔记
主要是LeetCode上剑指Offer2专栏的题目
XD流川枫
幸运来得若有似无
展开
-
单词搜索 II
单词搜索 II比较好想到的做法就是DFS+回溯。需要注意的是将答案存在一个set中,可以有效地去重。上述的方式复杂度比较高,主要的问题出在:每次都需要对每个word进行比对。如果使用前缀树,就可以实现每次DFS的时候通过比对前缀树,即可比对全部所有的word。......原创 2022-07-05 22:18:14 · 112 阅读 · 0 评论 -
offer_II_109开密码锁
开密码锁其实这题和那个单词接龙都很像,做法就是使用BFS广度优先遍历.先将0000加入队列中,然后将0000能够转移的状态全部加入队列,作为下一步可能存在的所有状态,然后再将这一层的全部状态进行一一判断,之后将对应能够得到的转移的状态加入到下一步的队列中.进行判断即可.其他的就是一些细节,看代码的注释!...原创 2022-06-11 19:48:03 · 1444 阅读 · 0 评论 -
子序列的数目
子序列的数目使用动态规划:这里dp[i][j]表示字符串s的前i个子字符中字符串t的前j个子字符出现的个数.那么状态转移方程这样考虑:因此状态转移方程为:原创 2022-06-10 20:28:16 · 479 阅读 · 0 评论 -
字符串交织
字符串交织动态规划:定义f(i,j)表示s1的前i个元素和s2的前j个元素是否能交织组成s3的前i+j个元素。原创 2022-06-08 22:36:33 · 393 阅读 · 0 评论 -
最少回文分割
最少回文分割动态规划来做:首先之前说过可以使用动态规划来判断一个字符串s的所有子串是否是回文子串,动态规划判断回文子串这个的原理就是用dp[i][j]表示s[i…j] 是否为回文串,那么状态转移方程为:可以从尾部开始进行动态规划,这样的话可以将所有的子字符串全部判断完.有了上面的基础之后,可以先通过上面的动态规划得到每个子字符串的回文情况.那么新的动态规划就好想了,dp2[i]表示字符串的前缀 s[0…i]的最少分割次数....原创 2022-06-07 20:59:19 · 403 阅读 · 0 评论 -
offer_II_106二分图
二分图对于图中的任意两个节点 u 和 v,如果它们之间有一条边直接相连,那么 u 和 v 必须属于不同的集合。如果给定的无向图连通,那么我们就可以任选一个节点开始,给它染成红色。随后我们对整个图进行遍历,将该节点直接相连的所有节点染成绿色,表示这些节点不能与起始节点属于同一个集合。我们再将这些绿色节点直接相连的所有节点染成红色,以此类推,直到无向图中的每个节点均被染色。如果我们能够成功染色,那么红色和绿色的节点各属于一个集合,这个无向图就是一个二分图;如果我们未能成功染色,即在染色的过程中,某一时刻访问原创 2022-06-06 20:42:59 · 88 阅读 · 0 评论 -
狒狒吃香蕉
狒狒吃香蕉先通过遍历找到吃香蕉的最大值和最小值,然后通过二分法来得到最终的结果.原创 2022-06-05 15:09:35 · 362 阅读 · 0 评论 -
[翻转字符]
翻转字符动态规划:方法一:其实最主要的是确定好状态,对于每个位置而言,就两种状态:针对每一个字符有两种选择,即翻转该字符和不翻转该字符.定义两个状态 f0(i - 1) 和 f1(i - 1),表示前 i 个字符翻转后得到的递增字符串分别以 ‘0’ 和 ‘1’ 结尾时共所需的最小翻转次数。那么状态的转移方程即为:方法二:dp表示翻转的最小代价,count表示1出现的个数.那么每次只需要判断:当出现0的时候,是将前面的1全部翻转,还是按照最小翻转代价dp的情况下将这一位的0也翻转为1.即dp =原创 2022-06-05 14:49:56 · 186 阅读 · 0 评论 -
排序的循环链表
排序的循环链表原创 2022-06-05 13:49:55 · 107 阅读 · 0 评论 -
分割回文子字符串
分割回文子字符串首先使用动态规划得到所有子串是否是回文子串的情况,这里参考这个动态规划判断回文子串,然后思路就是DFS+回溯即可.先判断当前子串是否是回文子串,如果是就DFS继续往后进行,然后回溯找到所有的情况即可!原创 2022-06-02 16:16:59 · 202 阅读 · 0 评论 -
动态规划判断回文子串
这里给出一个通过动态规划的方式对一个字符串s的所有子串进行是否是回文子串的判断,时间复杂度超级低.具体的思路是:dp[i][j]表示s[i…j] 是否为回文串,那么状态转移方程为:所以,从尾部开始将所有子串进行遍历然后即可获取每个子串的判断.原创 2022-06-02 16:13:09 · 274 阅读 · 0 评论 -
二指输入的的最小距离
二指输入的的最小距离原创 2022-05-31 23:35:10 · 81 阅读 · 0 评论 -
外星文字典
外星文字典这题其实还是拓扑排序的问题,拓扑排序问题就是解决有向图是否有环的.如果没有环则就是拓扑排序,否则就不是拓扑排序.同样,做这类题的思路就是:这道题里需要将外星文字典中的每个字母看成一个节点,将字母之间的顺序关系看成有向边。对于外星文字典中的两个相邻单词,同时从左到右遍历,当遇到第一个不相同的字母时,该位置的两个字母之间即存在顺序关系。以下两种情况不存在合法字母顺序:其余情况下都存在合法字母顺序,可以使用拓扑排序得到字典顺序。原创 2022-05-31 21:32:34 · 231 阅读 · 0 评论 -
删除无效的括号
删除无效的括号给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按 任意顺序 返回。示例 1:输入:s = “()())()”输出:[“(())()”,“()()()”]示例 2:输入:s = “(a)())()”输出:[“(a())()”,“(a)()()”]题目让删除括号使得剩下的括号匹配,要求删除最少的括号数,并且要求得到所有的结果。可以使用回溯算法,尝试遍历所有可能的去掉非法括号的方案。首先利用括号匹配的原创 2022-05-30 22:57:56 · 253 阅读 · 0 评论 -
课程表(拓扑排序问题)
课程表你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示例 1:输入原创 2022-05-30 21:34:32 · 510 阅读 · 0 评论 -
SpringMVC执行流程
SpringMVC执行流程具体过程:客户端(浏览器)发送请求,直接请求到DispatcherServletDispatcherServlet根据请求信息调用HandlerMapper解析请求对应的handler解析到对应的Handler(也就是Controller)后,开始由HandlerAdapter适配器进行处理HandlerAdapter会根据handler来调用真正的处理器开始处理请求处理器处理完业务之后,返回ModelAndView对象(Model是返回的数据对象,View是逻辑上原创 2022-05-14 15:45:48 · 107 阅读 · 0 评论 -
翻转数位[给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度]
翻转数位给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。示例 1:输入: num = 1775(110111011112)输出: 8示例 2:输入: num = 7(01112)输出: 4方法是真的巧妙 其中count代表的就是连续的1的个数,len是代表能够取到的包括改一位之后连续1的值当这一位是1的时候 count和len都++但是当这一位是0的时候 此时的len=count+1 相当于将前面连续的1的位数加上这一位是原创 2022-05-11 22:07:34 · 375 阅读 · 0 评论 -
单词拆分.
单词拆分给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以由 “leet” 和 “code” 拼接成。使用动态规划,dp[i]表示字符串s的长度为i是能不能成功被拼接.因此只需要保证原创 2022-05-29 22:46:36 · 66 阅读 · 0 评论 -
关于丑数(只包含质因子 2、3 和 5 的数称作丑数,求按从小到大的顺序的第 n 个丑数。)
丑数我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。这道题真的必须要好好研究一下了,我们得到的丑数一定是之前的丑数的 2、3 、5倍,并且当前位置要得到丑数只是取其中最小的那个.因此我们定义三个指针p2、p3、p5分别代表当前2、3 、5这些系数所叠加的丑数的索引位置index,也就是说当前该系数所得原创 2022-05-19 22:21:57 · 423 阅读 · 0 评论 -
水域大小[类似于岛屿面积]
水域大小你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。示例:输入:[[0,2,1,0],[0,1,0,1],[1,1,0,1],[0,1,0,1]]输出: [1,2,4]这种题其实都是一类问题,不论是岛屿面积或者岛屿数量再或者是水域大小,其实都是DFS的一个过程.只是相对的遍历条件会有一些不原创 2022-05-16 20:35:04 · 188 阅读 · 0 评论 -
T9键盘[用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表]
T9键盘在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射如下图所示:示例 1:输入: num = “8733”, words = [“tree”, “used”]输出: [“tree”, “used”]示例 2:输入: num = “2”, words = [“a”, “b”, “c”, “d”]输出: [“a”, “b”, “c”]最初的想法是原创 2022-05-16 20:57:35 · 1069 阅读 · 0 评论 -
数对和[设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。]
数对和设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。示例 1:输入: nums = [5,6,5], target = 11输出: [[5,6]]示例 2:输入: nums = [5,6,5,6], target = 11输出: [[5,6],[5,6]]其实就是两数之和的变形,两数之和中使用了时间复杂度为O(n)的做法,其实就是放在Map中,然后每次判断一下target-num在不在map中,如果在直接去除即可.所以第一种做法就是这个. public原创 2022-05-17 21:29:26 · 436 阅读 · 0 评论 -
冗余连接(并查集问题)
冗余连接树可以看成是一个连通且 无环 的 无向 图。给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边使用并查集即可,官方给的解答已经很棒了原创 2022-05-29 22:49:27 · 166 阅读 · 0 评论 -
不同的二叉搜索树
不同的二叉搜索树给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例 1:输入:n = 3输出:5示例 2:输入:n = 1输出:1*使用动态规划解决,dp[i]表示i个节点能够构建为二叉搜索树的数量.因为可以将这个问题分解成若干个子问题来解决.对于n而言,每个位置都可以做为根节点,而在这种情况下,例如当前作为根节点的是i,那么dp[i]问题可以分解为左右两个两个子树的数量求解问题.对于0<j&l原创 2022-05-29 22:55:24 · 71 阅读 · 0 评论 -
SpringBoot源码解析
SpringBoot源码解析1.启动的过程:首先在main函数中启动当前应用程序(SpringApplication启动)创建SpringApplication对象(new SpringApplication()).在对象的构造方法中进行参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在此过程中会加载整个应用程序中的spring.factories文件,将文件的内容放在缓存对象中,方便后续获取,具体步骤如下:配置resourceloader判断当前应用程序的类型获取原创 2022-05-14 15:44:38 · 5723 阅读 · 0 评论 -
字母与数字
字母与数字给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。示例 1:输入: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”,“H”,“I”,“J”,“K”,“L”,“M”]输出: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”]示例原创 2022-05-17 23:20:03 · 221 阅读 · 0 评论 -
并查集的问题
关于并查集的问题来源于左神算法视频中.是一个并查集的模板,最重要解决的问题是:支持集合的合并.其中最核心的两个功能是:1.查询两个样本是否属于一个集合2.合并两个集合具体的思路全部写在了代码的注释中.public class Union { //对样本进行包装 为元素 public static class Element<V> { public V value; public Element(V value) {原创 2022-05-27 16:10:43 · 105 阅读 · 0 评论 -
为高尔夫比赛砍树
为高尔夫比赛砍树你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中:0 表示障碍,无法触碰1 表示地面,可以行走比 1 大的数 表示有树的单元格,可以行走,数值表示树的高度每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。你将从 (0, 0) 点开始工作,返回你砍完所有树需要走的最小步数。 如果你无法砍原创 2022-05-23 22:48:44 · 148 阅读 · 0 评论 -
最长单词]
最长单词给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。示例:输入: [“cat”,“banana”,“dog”,“nana”,“walk”,“walker”,“dogwalker”]输出: “dogwalker”解释: "dogwalker"可由"dog"和"walker"组成。字典树+回溯:构建一颗字典树,先将所有的单词都放在字典树中.接着排序,然后将原创 2022-05-19 11:43:23 · 305 阅读 · 0 评论 -
布尔运算(给定一个布尔表达式和一个期望的布尔结果 result)
布尔运算给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几种可使该表达式得出 result 值的括号方法。示例 1:输入: s = “1^0|0|1”, result = 0输出: 2解释: 两种可能的括号方法是1^(0|(0|1))1^((0|0)|1)示例 2:输入: s = “0&0&0&1^1|0”, resu原创 2022-05-12 22:15:07 · 1629 阅读 · 0 评论 -
[模式匹配]
模式匹配你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。public static boolean patternMatching(String pattern,原创 2022-05-19 10:44:00 · 77 阅读 · 0 评论 -
变位词组(对字符串数组进行排序,将所有变位词组合在一起)
变位词组编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。注意:本题相对原题稍作修改示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]方法有二:第一种是使将每个str先转换为char[]然后进行排序,排序结果相同的放在一个list中//方法一:使用排序 //对两个字符串分别进行排序原创 2022-05-12 22:08:17 · 237 阅读 · 0 评论 -
交换和[给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。]
交换和给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。示例:输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]输出: [1, 3]示例:输入: array1 = [1, 2, 3], array2 = [4, 5, 6]输出: []思路也原创 2022-05-16 21:44:33 · 651 阅读 · 0 评论 -
最小K个数
最小K个数设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]其实就是一道排序题的变形,方法很多!你可以使用无脑的直接调用api排序后取出前k个的方式. public static int[] smallestK_1(int[] arr, int k) { Arrays.sort(arr); int[] ans = new int[k];原创 2022-05-19 15:35:28 · 126 阅读 · 0 评论 -
合并排序的数组
合并排序的数组给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化 A 和 B 的元素数量分别为 m 和 n。示例:输入:A = [1,2,3,0,0,0], m = 3B = [2,5,6], n = 3输出: [1,2,2,3,5,6]之前面试的时候也遇到过,算是一道简单题,这道题其实面试官希望你使用的方式是从后向前的双指针.比较简单 直接上代码吧 public void merge(int[]原创 2022-05-12 22:04:42 · 171 阅读 · 0 评论