随笔分类 - 剑指Offer
剑指Offer刷题之路
摘要:剑指 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的两个数字 首先就容易想到的就是暴力,但是我们一看数据范围,\(10^5\)。套$O(n^2)$一般来说一定会超时,经过实验也发现确实会超时。 class Solution { public int[] twoSum(int[] nums, int target) {
阅读全文
摘要:剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 这里可以考虑比较暴力的方式,先遍历一趟原数组$nums$,将奇偶数分开存储,再先遍历奇数列表,再遍历偶数列表,就可以保证奇偶数都按照顺序存储了。 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
阅读全文
摘要:剑指 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. 连续子数组的最大和 注意这里有要求要是$O(n)$的复杂度,我们记录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显然不可能是空树的一
阅读全文

浙公网安备 33010602011771号