随笔分类 -  剑指Offer

剑指Offer刷题之路
摘要:剑指 Offer 66. 构建乘积数组 看到数据范围是$1e5$就大概猜到了不能暴力,尝试了一下也确实TLE了。 class Solution { public int[] constructArr(int[] a) { int n = a.length; int[] res = new int[n 阅读全文
posted @ 2022-02-06 01:04 NullPointer_C 阅读(38) 评论(0) 推荐(0)
摘要:剑指 Offer 39. 数组中出现次数超过一半的数字 一个比较简单的办法就是哈希计数,统计次数大于$\frac{n}{2}$的数字。 class Solution { public int majorityElement(int[] nums) { int res = -1, n = nums.l 阅读全文
posted @ 2022-02-06 00:41 NullPointer_C 阅读(38) 评论(0) 推荐(0)
摘要:剑指 Offer 56 - II. 数组中数字出现的次数 II 最容易想到的自然还是map计数 class Solution { public int singleNumber(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); fo 阅读全文
posted @ 2022-02-05 01:43 NullPointer_C 阅读(33) 评论(0) 推荐(0)
摘要:剑指 Offer 56 - I. 数组中数字出现的次数 最容易想到的办法自然是哈希计数,但是我们发现题目的范围给到了$1e5$,不断的给哈希表扩容比较花时间,也需要$O(n)$的遍历时间,还需要开哈希表的$O(n)$空间。 class Solution { public int[] singleNu 阅读全文
posted @ 2022-02-05 01:26 NullPointer_C 阅读(32) 评论(0) 推荐(0)
摘要:剑指 Offer 65. 不用加减乘除做加法 计组没学好😂,属实是不太会做,因为加法有个定理 \(sum = a + b = increase + keep\),其中increase表示带有进位的结果,keep代表没有进位的结果,故而我们可以发现,$a + b$就等于$a + b$中不带进位的那一 阅读全文
posted @ 2022-02-05 01:05 NullPointer_C 阅读(27) 评论(0) 推荐(0)
摘要:剑指 Offer 15. 二进制中1的个数 因为题目限定了是$32$位整数,故而我们可以枚举$n$的每一位即可。 $(1 << i)$表示$n$的二进制数中的第$i + 1$位,因此我们枚举即可。 public class Solution { // you need to treat n as a 阅读全文
posted @ 2022-02-05 00:46 NullPointer_C 阅读(28) 评论(0) 推荐(0)
摘要:剑指 Offer 33. 二叉搜索树的后序遍历序列 我们首先需要注意到题目提供的是一颗BST树,所以我们可以知道这个性质,左子树 < 根节点 < 右子树。 又因为,题目给出的是后序遍历结果,所以也就是左子树->右子树->根节点。 因此我们可以尝试从后序遍历的尾部开始往前递归,但是,我们也需要知道左子 阅读全文
posted @ 2022-02-04 01:36 NullPointer_C 阅读(41) 评论(0) 推荐(0)
摘要:剑指 Offer 16. 数值的整数次方 自然最容易想到的就是枚举了,枚举1-n,这里有个细节就是要判断n的正负,并且n也取到了Integer.MIN_VALUE,若是将其反转,就会爆int😂,我也因此WA了好多发。 class Solution { public double myPow(dou 阅读全文
posted @ 2022-02-04 01:00 NullPointer_C 阅读(42) 评论(0) 推荐(0)
摘要:剑指 Offer 07. 重建二叉树 这里主要是要往分治上想,并且联系到中序序列和前序序列的关系。 我们知道中序序列,对于val而言,出现在val左边的值都在它的左子树上,出现在右侧的值都在它的右子树上。 那么我们考虑,遍历中序序列,将中序序列的值和其出现的索引位置映射,这样,我们就能比较容易的分割 阅读全文
posted @ 2022-02-04 00:02 NullPointer_C 阅读(32) 评论(0) 推荐(0)
摘要:剑指 Offer 68 - II. 二叉树的最近公共祖先 同理,由于给定的是二叉树,所以只有两个方向上的选择,对于p,q的公共祖先,如果p,q分别在root的一左一右,那么显然root就是最近的公共祖先,否则,就只有在同一侧了,如果在哪侧,就继续去遍历那一侧即可。 /** * Definition 阅读全文
posted @ 2022-02-02 23:30 NullPointer_C 阅读(34) 评论(0) 推荐(0)
摘要:剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 注意到这里给出的树是一颗BST树,所以满足有序条件,对于p,q两个节点来说,要找公共祖先且要求深度足够深,所以自然是从root开始找,如果p,q分别位于root的两侧,自然可以说明root是p,q的最近公共祖先,否则,则需要判断p,q是否分 阅读全文
posted @ 2022-02-02 22:54 NullPointer_C 阅读(27) 评论(0) 推荐(0)
摘要:剑指 Offer 64. 求1+2+…+n 这里之前做过类似的,所以直接一步到位了 class Solution { public int sumNums(int n) { int ans = n; boolean flag = (n > 0) && (ans += sumNums(n - 1)) 阅读全文
posted @ 2022-02-02 22:36 NullPointer_C 阅读(34) 评论(0) 推荐(0)
摘要:剑指 Offer 55 - II. 平衡二叉树 我们注意到题目要求我们验证所有的节点是否平衡,所以需要遍历到每一个节点,这里使用前序遍历的方式来遍历到每一个节点。 并且,对于每一个节点,需要满足的条件是左右子树高度差不超过1且左右子树均是平衡的。 所以可以写出如下代码: /** * Definiti 阅读全文
posted @ 2022-02-01 17:03 NullPointer_C 阅读(31) 评论(0) 推荐(0)
摘要:剑指 Offer 55 - I. 二叉树的深度 比较常见的递归,但是可能在面试过程中会要求要写非递归写法。 递归写法: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode l 阅读全文
posted @ 2022-02-01 16:35 NullPointer_C 阅读(29) 评论(0) 推荐(0)
摘要:剑指 Offer 41. 数据流中的中位数 不愧是困难题哇😂,确实有点难。一开始想的就是比较暴力的每次求mid的时候都来sort,但是众所周知sort时间复杂度为$O(nlogn)$,又会调用多次的mid,所以这里不使用这个办法。 还有就是可以在插入的时候想办法,定义一个超级大的arr,在每次插入 阅读全文
posted @ 2022-02-01 00:10 NullPointer_C 阅读(37) 评论(0) 推荐(0)
摘要:剑指 Offer 40. 最小的k个数 做这题有很多办法,如果内置了sort函数的语言,就比较简单,可以先排序,再取前k个数即可。 class Solution { public int[] getLeastNumbers(int[] arr, int k) { int[] ans = new in 阅读全文
posted @ 2022-01-31 22:42 NullPointer_C 阅读(30) 评论(0) 推荐(0)
摘要:剑指 Offer 61. 扑克牌中的顺子 这里我们可以先对数组排序,这样就更加方便地找递增位置。 如果i与i+1位置的元素相差恰好为1,那么说明此时恰为递增,故不需要用尝试用0来填充,如果否则记录下此时二者之间需要用多少张牌填充,即为$nums[i + 1] - nums[i] - 1$,最后返回0 阅读全文
posted @ 2022-01-30 23:27 NullPointer_C 阅读(32) 评论(0) 推荐(0)
摘要:剑指 Offer 45. 把数组排成最小的数 这里比较自然和联想到,我们选取字典序较小的在前面,而字典序较大的放在后面。但是这里也存在比如3和30这样的数如何排序的问题。 我们假设这样的两个字符串分别是x和y,组合在一起就是xy或yx,我们需要将较小的放在前面,所以只需要比较xy和yx的大小即可,若 阅读全文
posted @ 2022-01-30 23:08 NullPointer_C 阅读(37) 评论(0) 推荐(0)
摘要:剑指 Offer 54. 二叉搜索树的第k大节点 由于是BST,那么我们很容易想到将中序遍历的结果取第k大的数即可。 所以我们先用一个list把中序遍历得到的结果存储起来,再从中取第k大的那个即可。 /** * Definition for a binary tree node. * public 阅读全文
posted @ 2022-01-30 22:14 NullPointer_C 阅读(27) 评论(0) 推荐(0)
摘要:剑指 Offer 36. 二叉搜索树与双向链表 如果不考虑就地转换的话,可以注意到题目给出的二叉搜索树的条件,将所有的节点按照中序遍历的顺序添加进list中,再从头开始将right指针链好,再从尾部开始将left指针链好,再将头尾链好即可。 /* // Definition for a Node. 阅读全文
posted @ 2022-01-30 17:33 NullPointer_C 阅读(32) 评论(0) 推荐(0)