01 2022 档案
摘要:剑指 Offer 40. 最小的k个数 做这题有很多办法,如果内置了sort函数的语言,就比较简单,可以先排序,再取前k个数即可。 class Solution { public int[] getLeastNumbers(int[] arr, int k) { int[] ans = new in
阅读全文
摘要:剑指 Offer 61. 扑克牌中的顺子 这里我们可以先对数组排序,这样就更加方便地找递增位置。 如果i与i+1位置的元素相差恰好为1,那么说明此时恰为递增,故不需要用尝试用0来填充,如果否则记录下此时二者之间需要用多少张牌填充,即为,最后返回0
阅读全文
摘要:剑指 Offer 45. 把数组排成最小的数 这里比较自然和联想到,我们选取字典序较小的在前面,而字典序较大的放在后面。但是这里也存在比如3和30这样的数如何排序的问题。 我们假设这样的两个字符串分别是x和y,组合在一起就是xy或yx,我们需要将较小的放在前面,所以只需要比较xy和yx的大小即可,若
阅读全文
摘要:剑指 Offer 54. 二叉搜索树的第k大节点 由于是BST,那么我们很容易想到将中序遍历的结果取第k大的数即可。 所以我们先用一个list把中序遍历得到的结果存储起来,再从中取第k大的那个即可。 /** * Definition for a binary tree node. * public
阅读全文
摘要:剑指 Offer 36. 二叉搜索树与双向链表 如果不考虑就地转换的话,可以注意到题目给出的二叉搜索树的条件,将所有的节点按照中序遍历的顺序添加进list中,再从头开始将right指针链好,再从尾部开始将left指针链好,再将头尾链好即可。 /* // Definition for a Node.
阅读全文
摘要:剑指 Offer 34. 二叉树中和为某一值的路径 比较常见的回溯,但是回溯需要注意的小地方还是挺多的,特别是对于全局变量,因为它是所有栈空间共享的,所以当退出当前函数栈帧时,一定要将全局变量的栈帧恢复至入栈时刻的。 /** * Definition for a binary tree node.
阅读全文
摘要:剑指 Offer 13. 机器人的运动范围 这题需要注意它和前一题的不同之处。前一题是要求搜索问题,已经搜索到的单词的字母,如'A',在这一轮的搜索中没有被用上,但是可能从'A'的上一步的其他方向可能又走到'A',所以要恢复现场。 但是这里要统计的不是是否可以达,而是要统计可达的格子数,格子如果已经
阅读全文
摘要:剑指 Offer 12. 矩阵中的路径 dfs+剪枝问题。 这里由于是需要对所有的相邻节点尝试并且如果行不通需要重试,所以还需要回溯,回溯的过程中也有需要剪枝的地方,如走过的地方就不能再走,并且不能走出图外去。 这里我们用isContains表示这一轮的搜索是否搜到了要搜的字母,如果搜索到了,就继续
阅读全文
摘要:剑指 Offer 58 - I. 翻转单词顺序 人生苦短,我用python class Solution: def reverseWords(self, s: str) -> str: return " ".join(s.split()[::-1]) 但是这样的方式太取巧了,对语言要求也高,所以就不
阅读全文
摘要:剑指 Offer 57. 和为s的两个数字 首先就容易想到的就是暴力,但是我们一看数据范围,。套一般来说一定会超时,经过实验也发现确实会超时。 class Solution { public int[] twoSum(int[] nums, int target) {
阅读全文
摘要:剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 这里可以考虑比较暴力的方式,先遍历一趟原数组,将奇偶数分开存储,再先遍历奇数列表,再遍历偶数列表,就可以保证奇偶数都按照顺序存储了。 class Solution { public int[] exchange(int[] num
阅读全文
摘要:剑指 Offer 52. 两个链表的第一个公共节点 这里是一个比较典型的追及与相遇问题,假设公共段长度为l,链表A的总长度为a,单独段长度为a - l,链表B的总长度为b,单独段的长度为b - l,假如把a和b都看做弯曲并弯曲成圆形. 假设p和q分别从A,B的头结点开始追及,且两人速度一致,每次只走
阅读全文
摘要:剑指 Offer 25. 合并两个排序的链表 双路归并即可, 总的时间复杂度为O(n),关键在于怎么优化空间,可以是O(n),也可以是O(1)。 这题可以利用给好的空间在原空间上操作,可以进一步优化空间,每次new出新空间比较费空间,因为也是存一样的数字,没必要new出空间来了。 /** * Def
阅读全文
摘要:Java8虽然提出了很多新特性,但是在日常写项目和编程实践的使用还不是特别熟悉,写这个专栏记录一下Java8的学习之路。 JDK5 自动装、拆箱 从JDK5开始为所有基本数据类型都提供了与之对应的包装类,使基本数据类型也能够以OOP的方式来操作。 int -->Integer double -->
阅读全文
摘要:剑指 Offer 22. 链表中倒数第k个节点 一个比较简单的办法是先遍历一趟,得到长度l后,发现如下关系,倒数第1个节点为第l - 1个节点,倒数第2个节点为第l - 2个节点,故返回第l - k个节点即可。 正着数也就是l - k - 1索引位置处,故而遍历条件为i <= l - k - 1或i
阅读全文
摘要:剑指 Offer 18. 删除链表的节点 一开始还以为是那题,给定了结点,删除该节点的题目,但是后来发现两题有些不同,那题说明了要删除的节点一定不是尾节点,而这里没有保证,所以使用双指针即可。 pre值要删除节点的前一个节点,cur指向要删除的节点。找到要删除的节点后,将前一个节点的next指针指向
阅读全文
摘要:剑指 Offer 48. 最长不含重复字符的子字符串 对于字符串区间类题目,一般可以考虑使用滑动窗口来求解问题。 在滑动窗口中一般设置l和r两个指针,l指针指向窗口的左边缘,r指针指向窗口的右边缘,整个窗口的大小为r - l + 1。 在本题中,再用一个map或者set来查看窗口是否有重复数字,这里
阅读全文
摘要:剑指 Offer 46. 把数字翻译成字符串 写动态规划一定一定要记得画图, 结合数组的规律的示例才能更好的理解一些。 本题要求的是我们对于一个数字,且对于数字中的每一数位,可以将其转为一个字母,要求我们可以获得的转换个数。 如果没有头绪,可以先分析一些比较简单示例,对于0-9之间的数字,只有一一对
阅读全文
摘要:剑指 Offer 47. 礼物的最大价值 这里有一个好处在于所有值都是正的,所以处理起来不用像子数组一样处理和为负要重新选择,但是这里也是比较简单的。 可以用dp[i][j]记录我们走到[i][j]位置时所能获得的礼物最大价值,那么很显然,我们到达[i][j]位置有2种方式,从[i-1][j]即从上
阅读全文
摘要:剑指 Offer 42. 连续子数组的最大和 注意这里有要求要是的复杂度,我们记录dp[i]为以nums[i]结尾的最大连续子数组的和,终止返回值为ans,那么对于每一个位置i,以它结尾的子数组可以拼接前面的组成或者单独成子数组。 显然就有状态转移方程dp[i] = Math.max(d
阅读全文
摘要:剑指 Offer 63. 股票的最大利润 正经的dp做法应该是用dp[i]记录第i天售出股票所能获取的最大利润,然后从第i天起往前遍历,如果前面的购入价prices[j]有比今天的售价prices[i] = cur更低的,那么我们就尝试出售,并将获取的利润cur - prices[j]作为利润和dp
阅读全文
摘要:剑指 Offer 10- II. 青蛙跳台阶问题 和斐波那契数列一样的思路,这里有点不同的是,当台阶数为0的时候,有1中可达的方式,故而返回1。 class Solution { public int numWays(int n) { int MOD = (int)(1e9 + 7); int a
阅读全文
摘要:剑指 Offer 10- I. 斐波那契数列 这里需要注意的地方有两个: ①.这里要求的是第n项,但是有有第一项是F(0),所以也就是说要求的第n项也就是F(n-1); ②.对于结果需要对1e9+7取模; 所以写代码的时候需要注意,循环多少次,从哪里开始循环,循环的过程中怎么取模。 我们要a代表F(
阅读全文
摘要:剑指 Offer 28. 对称的二叉树 太fw了,又是之前写了的题,结果又不会做,已经快要被打击得没有自信了🤣。之前也不知道是不是自己写得,用bfs写的,一开始也是想用bfs,结果没有一点头绪,只好转向dfs,结果dfs也不会写🤣。 还是在评论区看到了怎么分析这题,下定决心不能再混了,太fw了,
阅读全文
摘要:剑指 Offer 27. 二叉树的镜像 感觉自己最近是咋了,好多以前写过的题都过了一段时间又拿起来做就又不会了😅。给👴整笑了,一开始就只想到了用bfs,再搜索每一层的时候反转过来,结果去翻自己之前写过的代码,用dfs写那么简单😂。 dfs解法 /** * Definition for a bi
阅读全文
摘要:剑指 Offer 26. 树的子结构 这题实在是坑太多了,稍不留心就掉进坑了。 也是足足WA了3次并且参考了题解发现自己的思路一些小问题才最后能够AC。 这里要非常注意到题目给出的一个信息:(约定空树不是任意一个树的子结构),再分析出现空树的情形。 ①:A为空树B不为空树,此时B显然不可能是空树的一
阅读全文
摘要:剑指 Offer 32 - III. 从上到下打印二叉树 III 依旧是bfs搜索,这里可以添加一个boolean标识来代表从头部添加还是尾部添加。 /** * Definition for a binary tree node. * public class TreeNode { * int va
阅读全文
摘要:剑指 Offer 32 - II. 从上到下打印二叉树 II 还是比较常规的bfs搜索,先用队列添加每一层,在遍历每一层的时候将每个节点的左右子树分别按顺序加入队列中即可。 /** * Definition for a binary tree node. * public class TreeNod
阅读全文
摘要:面试题32 - I. 从上到下打印二叉树 比较简单的层序遍历,使用队列遍历每一层并将下一层的节点添加进队列即可。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left
阅读全文
摘要:84. 求1+2+…+n 比较需要思考的题目,如果仅是不能使用乘除,还可以使用位运算来弥补,对于加减则比较麻烦。这里自己只能想到最笨的方法🤣,而且AcWing还增强了数据,仅仅是int型过不了。 class Solution { public: int getSum(int n) { long l
阅读全文
摘要:这个专栏记录自己学习MySQL45讲的记录 MySQL结构 通常我们在使用MySQL时,不太关心底层是如何执行的,但是我们如果了解MySQL的结构,在排查问题时也会更加方便。 大体来说,MySQL可以分为Server层和存储引擎层两部分,Server层包括连接器、查询缓存、分析器、优化器、执行器等,
阅读全文
摘要:剑指 Offer 50. 第一个只出现一次的字符 比较简单的map运用题,如果语言内有字符串查找算法还可以更加简单一些。 Java class Solution { public char firstUniqChar(String s) { if(null == s || s.equals(""))
阅读全文
摘要:剑指 Offer 11. 旋转数组的最小数字 注意,这里并没有告诉我们数组是否有序,而是可能有序,因此我们可以和选择字符串那题联系一下,找到分别有序的两个部分,将两部分分别反转后再整体反转,即可得到一个完全有序的数组。再返回数组的第一个数字即可。 class Solution { public in
阅读全文
摘要:剑指 Offer 04. 二维数组中的查找 一个比较简单的办法就是直接遍历这个二维数组,但是这样的办法效率比较低,并没有用到题目中提到的行列都是递增的条件。 class Solution { public boolean findNumberIn2DArray(int[][] matrix, int
阅读全文
摘要:剑指 Offer 53 - II. 0~n-1中缺失的数字 首先观察题目给我们的条件,有序递增数组中找元素,比较自然地会往二分上联系。一般的二分,我们找到答案后会直接返回,但这里的二分,我们需要不断缩小空间,直到找到为止。 class Solution { public int missingNum
阅读全文
摘要:剑指 Offer 53 - I. 在排序数组中查找数字 I 寻找数字左边界的二分,这里需要注意r和check函数的设置,这里选择的是不可以取到的r,即nums.length。 check的退出添加也是l < r。即l >= r时。 那么对于每个check,我们最终要得到的数字的左边界,如果nums[
阅读全文
摘要:剑指 Offer 03. 数组中重复的数字 对于此题,可以有几种不同的考虑,如果可以看出这是一类频率统计题,容易联系到哈希表,所以第一种方法也是比较容易想到的办法就是用哈希表来统计词频,这里由于数据范围可确定(0-n-1),可以用数组来简化一些代码上的书写,这种方法时间复杂度为,空间复杂
阅读全文
摘要:剑指 Offer 58 - II. 左旋转字符串 对于此题,如果用允许开辟新空间的算法,那么会比较简单,需要将n个字符移到原字符串的后面,所以考虑新字符串从位置为n处开始添加原字符串中的字符,再从0遍历至n,添加原字符串中的字符。 对于给定的k,因为此题给定了k < s.length。但我们为了追求
阅读全文
摘要:剑指 Offer 05. 替换空格 如果用Java语言的话,就比较简单了,只需要在遍历时,判断正遍历的字符是否为空格字符,若为空格字符,则在新串里添加即可。 class Solution { public String replaceSpace(String s) { StringBu
阅读全文
摘要:在学习算法题的过程中,最常见的就是字符串输入,一般都会涉及到几个不同的头文件,这里总结一下这几个同文件的异同之处。 <string.h> <string.h>是C语言中和字符串相关的头文件。C语言的内置数据类型中不包括字符串,只有字符数组char[],<string.h>中将字符数组的一些常用操作封
阅读全文
摘要:770. 单词替换 [题目描述] 输入一个字符串,以回车结束(字符串长度不超过 100)。 该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。 现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。 [输入格式] 输入共 3 行。 第 1 行是包含多个单词的字符串 s;
阅读全文
摘要:剑指 Offer 35. 复杂链表的复制 本题要求的是复制原链表,所以对于每一个原节点,都需要有一个和它相对应的老节点,从而我们建立一个老节点和新节点的映射关系,old2new,用来存储老节点和新节点的映射关联关系。 先遍历一趟原链表,将所有的节点都创建与之对应的新节点。 再遍历一趟链表时,将每个节
阅读全文
摘要:剑指 Offer 24. 反转链表 新建虚拟头,遍历原链表解法 一个比较简单可以将所有操作融合的解法是先新建一个虚拟头,然后依次遍历原链表,每次将正在遍历的位置插入到头结点,这样遍历完成后,得到的就是反转后的链表。 /** * Definition for singly-linked list. *
阅读全文
摘要:剑指 Offer 06. 从尾到头打印链表 递归解法 这里的一个比较简单的办法就是递归,由于需要的是从尾部开始打印链表,所以也就是递归出栈时打印,所以添加元素的操作在出栈时完成。 /** * Definition for singly-linked list. * public class List
阅读全文
摘要:AcWing-739-数组选择 这里主要是为了记录如何格式化输出以及比较浮点数的大小。因为在计算机中不是所有浮点数都可以精确的表示,所以在比较浮点数时,通常会让两个浮点数之差小于一个很小的数,达到比较的效果。 而格式化输入也只需要指定格式和要输出的对象即可。 import java.io.*; im
阅读全文
摘要:剑指 Offer 30. 包含min函数的栈  比较简单的办法是创建两个栈,一个栈存原本需要入栈的元素,一个存当前
阅读全文
摘要:剑指 Offer 09. 用两个栈实现队列 思路比较好想到,可以先用一个栈全部存储入队元素,设这个栈为,需要出栈时,判断另一个栈是否空,若为空,且不为空,则说明可以从刚才入队的元素出队,于是的元素转移到,并将弹栈,这样的
阅读全文
摘要:2005. 马蹄铁 题目描述 尽管奶牛贝茜发现每个平衡括号字符串都很美观,但她特别喜欢被她称为“完全”平衡的括号字符串 一个由 ( 构成的字符串后接一个长度相同的 ) 构成的字符串。 例如: (((()))) 有一天,当贝茜穿过牛棚时,她发现地面上有一个 的马蹄铁矩阵。每个马蹄铁的方
阅读全文
摘要:2014. 岛 题目描述: 每当下雨时,农夫约翰的田地总是被洪水淹没。 由于田地不是完全水平的,所以一些地方充满水后,留下了许多被水隔开的“岛”。 约翰的田地被描述为由 个连续高度值 指定的一维场景。 假设该场景被无限高的围墙包围着,请考虑暴雨期间发生的情况:
阅读全文
摘要:title: AcWing-2019-拖拉机 date: 2022-01-05 19:37:43 categories: AcWing tags: [AcWing,algorithm] 2019. 拖拉机 题目描述 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了。 他的奶牛非常调皮,决定
阅读全文
摘要:2060. 奶牛选美 题目描述 听说最近两斑点的奶牛最受欢迎,约翰立即购进了一批两斑点牛。 不幸的是,时尚潮流往往变化很快,当前最受欢迎的牛变成了一斑点牛。 约翰希望通过给每头奶牛涂色,使得它们身上的两个斑点能够合为一个斑点,让它们能够更加时尚。 牛皮可用一个 N×M 的字符矩阵来表示,如下所示:
阅读全文
摘要:2041. 干草堆 题目描述 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来。 开始时,共有 N 个空干草堆,编号 1∼N。 约翰给贝茜下达了 K 个指令,每条指令的格式为 A B,这意味着贝茜要在 A..B 范围内的每个干草堆的顶部添加一个新的干草捆。
阅读全文
摘要:2058.笨拙的手指 tags(位运算,暴力) 题目提到了给定的两个数都只有一位错了,那么我们可以枚举这两个数在不同位错了的情况,若改正后,即和分别转换后变为,则说明此时即是我们要找的正确结果,输出即可。 于是可以嵌套两层循环,分
阅读全文