02 2022 档案

摘要:剑指 Offer 04. 二维数组中的查找 首先需要注意到题目下方的数据范围,n和m可能是0,所以当n等于0时,需要及时返回false,因为此时矩阵都不存在了,所以也就不存在有target了。 这里还需要注意到题目上说到的是,从左到右依次递增,从上到下依次递增,所以我们取左上角作为中点进行二分,当当 阅读全文
posted @ 2022-02-16 20:42 NullPointer_C 阅读(26) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 03. 数组中重复的数字 首先可以注意到数组长度为n,所有的元素都在0~n-1之间,所以可以开一个长为n的数组用来记录每个元素的次数,当某一个元素的出现频率大于2时,说明这是重复的,可以返回 class Solution { public int findRepeatNumber( 阅读全文
posted @ 2022-02-16 20:32 NullPointer_C 阅读(29) 评论(0) 推荐(0) 编辑
摘要:太恶心了这题,处理边界处理了半天,这里提到不能用*,/,%,所以就考虑了使用减法来模拟除法。 思路是首先需要做特判,比如a被除数等于0,可以直接返回,b除数等于0,则不是有效的除法运算,需要抛异常。 还有当a为最小整数,b为-1时,二者相除会得到超过整数最大值的数,需要返回Integer.MAX_V 阅读全文
posted @ 2022-02-15 23:56 NullPointer_C 阅读(66) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 14- II. 剪绳子 II 这里需要注意到数据范围已经从Ⅰ的1-58更新至1000,且需要对1e9+7取模运算,所以这里已经不能再使用dp了,因为dp需要使用max,所以不能比较出后来的和之前的哪个大,这里只能使用数学方法了,即整数定理,可以把任何一个整数分成是2和3的和,且3比 阅读全文
posted @ 2022-02-14 15:49 NullPointer_C 阅读(20) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 51. 数组中的逆序对 最容易想到的做法当然是暴力的枚举每一组数对,(nums[i],nums[j]),时间复杂度为O(n2),对应数据范围为5e4,很容易就超时了。 int reversePairs(int* nums, int numsSize){ int 阅读全文
posted @ 2022-02-13 15:19 NullPointer_C 阅读(29) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 17. 打印从1到最大的n位数 注意这里的n是表示位数,所以最大的数也就是枚举每一位都是9的情况。 最后从1枚举到最后一位即可。 class Solution { public int[] printNumbers(int n) { if(n <= 0) { return new 阅读全文
posted @ 2022-02-13 14:43 NullPointer_C 阅读(30) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 60. n个骰子的点数 概率dp。 我们用dp[i][j]表示使用i个骰子投出总和j的概率,容易得到n个骰子最大的和为6×n,即全为6的情况,范围在[n, 6n]之间,共计有5×n+1种情况。 如果暴力求解,那么范围就会在6n阅读全文
posted @ 2022-02-12 21:45 NullPointer_C 阅读(31) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 49. 丑数 多路归并+dp,可以看出所有的丑数都是由质因数235乘上比它更小的丑数得到的,于是,现在假设有3个数组,分别是: A:{12,22,32,42,52,62,82,102......} B:{13,23,33,43,53,63,83,103..... 阅读全文
posted @ 2022-02-12 17:36 NullPointer_C 阅读(26) 评论(0) 推荐(0) 编辑
摘要:面试题19. 正则表达式匹配 太难了,要是面试的时候碰到这种题,直接寄了。 最简单的办法就是直接调库 class Solution { public boolean isMatch(String s, String p) { return s.matches(p); } } dp做法如下: clas 阅读全文
posted @ 2022-02-12 17:12 NullPointer_C 阅读(48) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 38. 字符串的排列 和含有重复数组的组合问题是同样的思路,需要在同一树层上去重,因为会重复。 class Solution { public String[] permutation(String s) { if(s == null || s.equals("")) { retu 阅读全文
posted @ 2022-02-11 20:08 NullPointer_C 阅读(23) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 37. 序列化二叉树 这里想到的比较容易的方式是使用层序遍历的结果来序列化,再利用层序遍历的方式来反序列树。 但是需要注意的是,由于我们要序列化的树是唯一的,所以我们需要标记空节点。 并且,我们将序列化的结果按照顺序加入到数组中,查看根节点和子树的关系。 对于某个节点node,它在 阅读全文
posted @ 2022-02-11 19:58 NullPointer_C 阅读(22) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 59 - II. 队列的最大值 用一个queue和一个deque来实现,queue用来正常的push_back和pop_front,deque用来存储最大值。 如果新加入的value比deque的尾端更大,那么deque就一直在尾端出队,直到尾端的值比value更大或者队列为空。 阅读全文
posted @ 2022-02-10 01:05 NullPointer_C 阅读(27) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 59 - I. 滑动窗口的最大值 理解起来不难,可以一直维护最大值及其下标即可,如果窗口内有比当前最大值更大的,则更新最大值即可,如果当前最大值已经不在窗口内了,需要在窗口中重新找过一个最大值。 class Solution { public int[] maxSlidingWin 阅读全文
posted @ 2022-02-10 00:39 NullPointer_C 阅读(19) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 67. 把字符串转换成整数 这破题,麻烦得一匹的同时,还要面向测试用例编程,非常麻烦,如果用户真的输入这种,应该在前端就给return掉,给后端只会更加麻烦。😭 class Solution { public int strToInt(String str) { char[] c 阅读全文
posted @ 2022-02-09 01:27 NullPointer_C 阅读(28) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 20. 表示数值的字符串 这种大模拟题真的就是磨练心态的,太麻烦了,wa得没脾气。 总结起来就是一定要有数字,小数点前必须有数字并且小数点前面不能有e,e前面必须有数字且前面不能有e,有e之后为了有指数,需要重置numCnt,符号必须出现在第一位或者在e后面。 class So 阅读全文
posted @ 2022-02-09 01:04 NullPointer_C 阅读(44) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 31. 栈的压入、弹出序列 连模拟都没有想到了😂。 我们不断将入栈序列pushed入栈,若栈顶元素和popped遍历到的位置popped[pos]相同,则表示找到了同样的出栈序列,则将pos加1,否则继续入栈,直到栈顶和遍历至的位置相同。 最后判断pos是否遍 阅读全文
posted @ 2022-02-08 00:45 NullPointer_C 阅读(20) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 29. 顺时针打印矩阵 老面孔了,只要画图注意边界即可。 class Solution { public int[] spiralOrder(int[][] matrix) { int u = 0, d = matrix.length - 1; // 排除非矩阵的情况 if(d < 阅读全文
posted @ 2022-02-08 00:36 NullPointer_C 阅读(23) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 62. 圆圈中最后剩下的数字 这里没有想到什么更好的办法,只好模拟了,每一次要删除的位置idx可以从上一次删除的位置idx模拟得到。 若上一次要删除的位置为idx,那么再下一次的删除位置就需要加m,由于这里说的是第m个,并且对于后面的数字来说,就相当于往前移动了1为,所以换 阅读全文
posted @ 2022-02-08 00:22 NullPointer_C 阅读(27) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 57 - II. 和为s的连续正数序列 想不到比较好的办法,只好暴力从每一个位置i往后枚举。 class Solution { public int[][] findContinuousSequence(int target) { List<List<Integer>> res 阅读全文
posted @ 2022-02-07 23:58 NullPointer_C 阅读(26) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 14- I. 剪绳子 这里没有马上想到数学的方法,而是先想到了dp的方法。 对于一个整数i,如果可以被划分为jij,那么设dp[i]为整数i的最大划分,则可以枚举1i之间的所有j,\(dp[i] = Math.max(dp[i], j * 阅读全文
posted @ 2022-02-07 23:11 NullPointer_C 阅读(30) 评论(0) 推荐(0) 编辑
摘要:剑指 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 阅读(33) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 39. 数组中出现次数超过一半的数字 一个比较简单的办法就是哈希计数,统计次数大于n2的数字。 class Solution { public int majorityElement(int[] nums) { int res = -1, n = nums.l 阅读全文
posted @ 2022-02-06 00:41 NullPointer_C 阅读(30) 评论(0) 推荐(0) 编辑
摘要:前面我们了解了SQL查询语句是如何执行的,一条SQL查询语句的过程需要经过连接器、分析器、优化器、执行器等功能模块,最终到达存储引擎。 在MySQL中,可以恢复到半个月内的任何一个时间点,这时基于日志系统来实现的。 更新语句的流程 在这个例子中,假设创建了表T。 create table T(ID 阅读全文
posted @ 2022-02-05 17:19 NullPointer_C 阅读(107) 评论(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 阅读(27) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 56 - I. 数组中数字出现的次数 最容易想到的办法自然是哈希计数,但是我们发现题目的范围给到了1e5,不断的给哈希表扩容比较花时间,也需要O(n)的遍历时间,还需要开哈希表的O(n)空间。 class Solution { public int[] singleNu 阅读全文
posted @ 2022-02-05 01:26 NullPointer_C 阅读(17) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 65. 不用加减乘除做加法 计组没学好😂,属实是不太会做,因为加法有个定理 sum=a+b=increase+keep,其中increase表示带有进位的结果,keep代表没有进位的结果,故而我们可以发现,a+b就等于a+b中不带进位的那一 阅读全文
posted @ 2022-02-05 01:05 NullPointer_C 阅读(23) 评论(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 阅读(25) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 33. 二叉搜索树的后序遍历序列 我们首先需要注意到题目提供的是一颗BST树,所以我们可以知道这个性质,左子树 < 根节点 < 右子树。 又因为,题目给出的是后序遍历结果,所以也就是左子树->右子树->根节点。 因此我们可以尝试从后序遍历的尾部开始往前递归,但是,我们也需要知道左子 阅读全文
posted @ 2022-02-04 01:36 NullPointer_C 阅读(22) 评论(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 阅读(29) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 07. 重建二叉树 这里主要是要往分治上想,并且联系到中序序列和前序序列的关系。 我们知道中序序列,对于val而言,出现在val左边的值都在它的左子树上,出现在右侧的值都在它的右子树上。 那么我们考虑,遍历中序序列,将中序序列的值和其出现的索引位置映射,这样,我们就能比较容易的分割 阅读全文
posted @ 2022-02-04 00:02 NullPointer_C 阅读(23) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 68 - II. 二叉树的最近公共祖先 同理,由于给定的是二叉树,所以只有两个方向上的选择,对于p,q的公共祖先,如果p,q分别在root的一左一右,那么显然root就是最近的公共祖先,否则,就只有在同一侧了,如果在哪侧,就继续去遍历那一侧即可。 /** * Definition 阅读全文
posted @ 2022-02-02 23:30 NullPointer_C 阅读(26) 评论(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 阅读(20) 评论(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 阅读(22) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 55 - II. 平衡二叉树 我们注意到题目要求我们验证所有的节点是否平衡,所以需要遍历到每一个节点,这里使用前序遍历的方式来遍历到每一个节点。 并且,对于每一个节点,需要满足的条件是左右子树高度差不超过1且左右子树均是平衡的。 所以可以写出如下代码: /** * Definiti 阅读全文
posted @ 2022-02-01 17:03 NullPointer_C 阅读(22) 评论(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 阅读(24) 评论(0) 推荐(0) 编辑
摘要:剑指 Offer 41. 数据流中的中位数 不愧是困难题哇😂,确实有点难。一开始想的就是比较暴力的每次求mid的时候都来sort,但是众所周知sort时间复杂度为O(nlogn),又会调用多次的mid,所以这里不使用这个办法。 还有就是可以在插入的时候想办法,定义一个超级大的arr,在每次插入 阅读全文
posted @ 2022-02-01 00:10 NullPointer_C 阅读(25) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示