摘要: 本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正 1. 关于无参构造函数与有参构造函数 我们都知道如果不定义无参构造函数系统会自动调用默认构造函数 当我们定义了一个有参构造函数,就必须手动定义一个无参构造函数 这里来尝试分析下原因,首先要了解下构造函数的调用逻辑 上图中我们可以看出子 阅读全文
posted @ 2021-04-13 23:39 jchen104 阅读(59) 评论(0) 推荐(0) 编辑
摘要: 本题在两数之和的基础上又增加了数组递增的属性,因此我们除了利用哈希映射外 又多了一种方法,那就是二分查找。 针对每一个数组元素,做二分查找,查找的目标即为target-numbers[i] 本题需要注意的点有2个, (1)不能使用相同元素,即查找的low需要是i+1 (2)返回的数组下标是从1开始的 阅读全文
posted @ 2021-04-13 09:13 jchen104 阅读(39) 评论(0) 推荐(0) 编辑
摘要: 使用广度优先 使用2个队列,一个纪录树的节点,一个纪录节点对应的值 时间O(n)(每个节点都被访问一遍),空间O(n)(叶子节点最多为平衡二叉树情况下n/2) public boolean hasPathSum(TreeNode root, int targetSum) { if (root==nu 阅读全文
posted @ 2021-04-12 15:21 jchen104 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 给定二进制数,要求计算该二进制数中1的个数 小知识:二进制数与int整形10进制数是可以自动转换得,如下图 方法一: 循环检验n得每一位是否为1,时间O(k)(k为2进制数的长度,本题为32),空间O(1) public int hammingWeight(int n) { int res = 0; 阅读全文
posted @ 2021-04-12 15:18 jchen104 阅读(49) 评论(0) 推荐(0) 编辑
摘要: 二叉树的建立方式是不唯一的,因此这里我们不同的方法建立的二叉树也是不一致的 这里我用的方法是二分法取中间元素建立当前叶子节点 时间O(n)(每个元素都需要遍历一遍),空间O(logn)(本次建立的二叉树要保持平衡,所以树的高度固定为logn) class Solution { public Tree 阅读全文
posted @ 2021-04-10 14:48 jchen104 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 1. 使用DFS解法 递归计算每颗字数的最大深度 时间O(n)(每个节点都要被遍历一次),空间O(h)(与递归深度有关,递归深度又与二叉树高度相关) public int maxDepth(TreeNode root) { if (root==null) return 0; int left = m 阅读全文
posted @ 2021-04-09 14:44 jchen104 阅读(68) 评论(0) 推荐(0) 编辑
摘要: 暂时没有想到非递归的方法,这里用递归来处理了 根据题目的定义,我们可以通过计算每一棵子树的左右高度差, 只要有一个子树不平衡,则整体不平衡(这里有个优化小细节,我们以-1为标记位,当出现-1则整棵树 不平衡,不需要再做后续判断) 时间O(n),空间O(n) private int def(TreeN 阅读全文
posted @ 2021-04-08 14:30 jchen104 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 老规矩,使用队列辅助完成广度优先遍历操作。 从根节点开始将左右孩子压入队列。 然后不停的从队列出去首2位元素(left,right)进行比较, 如相等,再将left节点的left节点与right节点的right节点。 这里有点绕人,需要结合图片理解 在比较完根节点的2个子孩子2和2后,根据镜像的性质 阅读全文
posted @ 2021-04-08 11:39 jchen104 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 弗洛伊德算法,快慢指针可解 假设headA与headB相交,且分别长a+c,b+c(c为相交长度) 那么必然存在a+c+b+c=b+c+a+c(即当我们遍历完headA后再遍历headB与 先遍历headB再遍历headA,最终一定会在同一节点处相遇) 然后我们发现,即使不相交,依然存在a+b=b+ 阅读全文
posted @ 2021-04-07 16:35 jchen104 阅读(27) 评论(0) 推荐(0) 编辑
摘要: 快慢指针,也叫佛洛依德算法 即使用一个快指针,每次前进2位,慢指针每次前进1位,如果存在环, 则快慢指针必然会在环的开始处相交(可以参考追及问题) 时间O(n),空间O(1) public boolean hasCycle(ListNode head) { // 首先确保后续节点存在 if (hea 阅读全文
posted @ 2021-04-07 11:51 jchen104 阅读(32) 评论(0) 推荐(0) 编辑