04 2021 档案
摘要:BFS解,时间O(n^2),空间O(n^2) 1 public List<String> binaryTreePaths(TreeNode root) { 2 List<String> paths = new ArrayList<String>(); 3 if(root==null) return
阅读全文
摘要:参考 268. 丢失的数字 ,题目要求2边的和相同,我们可以首计算出总的和, 然后再遍历一遍,计算出已扫描过的区间和,再与两数相减的和比较即可。 时间O(n),空间O(1) 1 public int pivotIndex(int[] nums) { 2 long sum=0; 3 for(int n
阅读全文
摘要:第一反应是用Map建立哈希映射来比对对应关系,知道看到大佬的题解 根据题意,字符串中相同的字符必然对应同一个映射 时间O(n)(这里的n其实并不准确,因为indexOf内部是使用的暴力的方法去查找),空间O(1) 1 public boolean isIsomorphic(String s, Str
阅读全文
摘要:时间O(n),空间O(1) 1 public int[] plusOne(int[] digits) { 2 int len=digits.length,tag=1; 3 for(int i=len-1;i>=0;i--){ 4 tag=digits[i]+tag; 5 digits[i]=tag%
阅读全文
摘要:三个数相乘的最大值,有2种可能,(1)3个最大的正数(2)2个最小的负数和1个最大的正数。 方法一:先排序,排序后最小的负数和最大的正数位置就是确定的了 (1)必然是nums[n-3],nums[n-2],nums[n-1] (2)必然是nums[0],nums[1],nums[n-1] 时间O(n
阅读全文
摘要:本题的难点在于存在负数,我们知道非负数的平方数排序规则一定与 原数组顺序相同,但这里存在负数,导致无法直接确定 方法一:先计算出所有数的平方,然后排序 时间O(nlogn)(排序所用时间),空间O(logn)(排序所申请栈空间与深度有关,这里忽略了返回要求数组的空间) 1 class Solutio
阅读全文
摘要:利用哈希映射的思路来处理,记录子串在父串中每个字符出现的位置 时间O(nk)(k与父串中相应字符出现离散度有关,最差情况下k=m,即父串的长度),空间O(h)(h为字串离散度,本题为26) public boolean canConstruct(String ransomNote, String m
阅读全文
摘要:删除链表元素我们很熟了,但需要确保head如果去除的话该如何返回的问题。 public ListNode removeElements(ListNode head, int val) { ListNode res = new ListNode(0); res.next=head; ListNode
阅读全文
摘要:迭代链表中的每个节点,依次递推 public ListNode deleteDuplicates(ListNode head) { ListNode curr=head; while(curr!=null && curr.next!=null){ // 如前后2个节点相同,则丢弃next节点,将当前
阅读全文
摘要:对于这题,参数只有需要被删除的这个元素。 这里我们以 4,5,1,9为例,我们要删除1,我们可以将9覆盖1的val,同时将1的next指向9的next, 这样就相当于我们用后一节点的值覆盖当前节点,然后丢下后续节点,直接指向next.next节点。 public void deleteNode(Li
阅读全文
摘要:方法一:使用set来存储2个数组的元素 时间O(m+n),空间O(m+n) public int[] intersection(int[] nums1, int[] nums2) { if (nums1==null || nums2==null || nums1.length==0 || nums2
阅读全文
摘要:原谅我是个数学渣渣,幸好有甜姨的解析,结论就是迭代所得的数字必然是收敛的 由此便得到了2种可能情况 (1) 收敛为1 (2) 迭代结果出现环,无法收敛 看到这两个图其实我们就想到了之前做的题目,判断链表是否存在环,用的办法是佛洛依德算法,快慢指针判断, 于是我们这里也可以用快慢指针来实现 class
阅读全文
摘要:我们知道10=5*2,那么末尾0的个数实际上就是看2和5出现的次数,因为 只要是偶数就可以拆分成2*x,2的出现次数必然高于5,所以实际上结果 是由5的出现次数决定的。 比如25的末尾零=(1*5)(2*5)(3*5)(4*5)(5*5),在对5取余后由于25=5*5,所以实际上还有一层5, 由此可
阅读全文
摘要:根据回文的定义,有2种可能,(1)字符串中所有字符出现次数为偶数,(2)字符串中只有一个字符出现次数为奇数(在中间位置) 所以我们只需要统计整个字符串中是否存在1个以上出现次数为奇数的元素 时间O(n),空间O(s)(s为整个字符串的离散度) public boolean canPermutePal
阅读全文
摘要:广度优先遍历,依次访问2颗树的每一个节点并经行比较 时间O(n),空间O(n) public boolean isSameTree(TreeNode p, TreeNode q) { Deque<TreeNode> queue1 = new LinkedList<TreeNode>(); Deque
阅读全文
摘要:感受轮子的快乐,时间O(n),空间O(n) public boolean containsDuplicate(int[] nums) { Set<Integer> set = new HashSet<Integer>(); for(int num:nums){ if(!set.add(num)){
阅读全文
摘要:本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正 一、this与super this与super都指向对象,区别在于this指向当前对象,super指向父类对象 二、static与类、对象的初始化 static为静态标识,被static标记的成员变量、方法将会被在类被加载时初始化且只
阅读全文
摘要:简单迭代即可 时间O(n),空间O(1) public int removeElement(int[] nums, int val) { int index=0; for(int num:nums){ // 遇到不相等元素则直接向数组内插入 if(num!=val){ nums[index++]=n
阅读全文
摘要:排序,然后比较开始结束时间即可 时间O(nlogn)(主要消耗在排序上),空间O(1) public boolean canAttendMeetings(int[][] intervals) { Arrays.sort(intervals, new Comparator<int[]>() { pub
阅读全文
摘要:这题和之前的268. 丢失的数字 、136. 只出现一次的数字 、387. 字符串中的第一个唯一字符 有类似又有不同的地方 由于本题中的数组元素存在相同元素,有的出现2次,有的出现1次,所以不能使用异或来直接得出结果。 于是我们想到使用哈希表来构建映射关系,参考387题。 但是题目提出了进一步的要求
阅读全文
摘要:一、基本定义 Arrays类,全路径java.util.Arrays,主要功能为操作数组,Arrays类的所有方法均为静态方法,所以 调用方式全部为Arrays.方法名 二、常用方法 1. <T> List<T> asList(T... a) 可以将数组转化为相应的list集合,但是也只能转化为li
阅读全文
摘要:老题目了,使用迭代可解(不建议用递归,会产生较多冗余计算) 时间O(n),空间O(1) public int fib(int n) { if (n<2) return n; int i=0,j=1,count=2; while(count<=n){ int temp = j; j=i+j; i=te
阅读全文
摘要:题目要求判断一棵树是否包含另一棵树,广度优先遍历由于需要维护一个队列, 这个队列会依次把每一层的节点全部压入队列,在本题中本层的其他节点会造成干扰项, 所以我们使用深度优先 方法一:深度优先遍历暴力破解 class Solution { public boolean isSubtree(TreeNo
阅读全文
摘要:本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正 1. 关于无参构造函数与有参构造函数 我们都知道如果不定义无参构造函数系统会自动调用默认构造函数 当我们定义了一个有参构造函数,就必须手动定义一个无参构造函数 这里来尝试分析下原因,首先要了解下构造函数的调用逻辑 上图中我们可以看出子
阅读全文
摘要:本题在两数之和的基础上又增加了数组递增的属性,因此我们除了利用哈希映射外 又多了一种方法,那就是二分查找。 针对每一个数组元素,做二分查找,查找的目标即为target-numbers[i] 本题需要注意的点有2个, (1)不能使用相同元素,即查找的low需要是i+1 (2)返回的数组下标是从1开始的
阅读全文
摘要:使用广度优先 使用2个队列,一个纪录树的节点,一个纪录节点对应的值 时间O(n)(每个节点都被访问一遍),空间O(n)(叶子节点最多为平衡二叉树情况下n/2) public boolean hasPathSum(TreeNode root, int targetSum) { if (root==nu
阅读全文
摘要:给定二进制数,要求计算该二进制数中1的个数 小知识:二进制数与int整形10进制数是可以自动转换得,如下图 方法一: 循环检验n得每一位是否为1,时间O(k)(k为2进制数的长度,本题为32),空间O(1) public int hammingWeight(int n) { int res = 0;
阅读全文
摘要:二叉树的建立方式是不唯一的,因此这里我们不同的方法建立的二叉树也是不一致的 这里我用的方法是二分法取中间元素建立当前叶子节点 时间O(n)(每个元素都需要遍历一遍),空间O(logn)(本次建立的二叉树要保持平衡,所以树的高度固定为logn) class Solution { public Tree
阅读全文
摘要:1. 使用DFS解法 递归计算每颗字数的最大深度 时间O(n)(每个节点都要被遍历一次),空间O(h)(与递归深度有关,递归深度又与二叉树高度相关) public int maxDepth(TreeNode root) { if (root==null) return 0; int left = m
阅读全文
摘要:暂时没有想到非递归的方法,这里用递归来处理了 根据题目的定义,我们可以通过计算每一棵子树的左右高度差, 只要有一个子树不平衡,则整体不平衡(这里有个优化小细节,我们以-1为标记位,当出现-1则整棵树 不平衡,不需要再做后续判断) 时间O(n),空间O(n) private int def(TreeN
阅读全文
摘要:老规矩,使用队列辅助完成广度优先遍历操作。 从根节点开始将左右孩子压入队列。 然后不停的从队列出去首2位元素(left,right)进行比较, 如相等,再将left节点的left节点与right节点的right节点。 这里有点绕人,需要结合图片理解 在比较完根节点的2个子孩子2和2后,根据镜像的性质
阅读全文
摘要:弗洛伊德算法,快慢指针可解 假设headA与headB相交,且分别长a+c,b+c(c为相交长度) 那么必然存在a+c+b+c=b+c+a+c(即当我们遍历完headA后再遍历headB与 先遍历headB再遍历headA,最终一定会在同一节点处相遇) 然后我们发现,即使不相交,依然存在a+b=b+
阅读全文
摘要:快慢指针,也叫佛洛依德算法 即使用一个快指针,每次前进2位,慢指针每次前进1位,如果存在环, 则快慢指针必然会在环的开始处相交(可以参考追及问题) 时间O(n),空间O(1) public boolean hasCycle(ListNode head) { // 首先确保后续节点存在 if (hea
阅读全文
摘要:翻转二叉树,2种方案,递归与非递归 (个人更喜欢非递归的方案,大多数情况下非递归的迭代都拥有更低的时空间复杂度,当然也存在 傅里叶快速变换那种小而美的递归方案,见仁见智吧) 1. 递归(深度优先遍历方案) 此方案中,我们会直接从最顶层父节点,一路递归至最左侧叶子节点, 然后再递归至其父节点的右孩子,
阅读全文
摘要:首先复习下二叉搜索树BST的概念,总结一下就是 1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。3.任意结点的左、右子树也分别为二叉搜索树 参考了下大佬的解答, 如果两个节点值都小于根节点,说明他们
阅读全文
摘要:这题可以利用双指针倒排得办法。 我们创建3个指针,分别指向p1,p2分别指向数组1,2得末尾,p3指向数组1得末尾。 从后向前数组遍历nums1,从尾部值开始比较遍历,迭代比较值大小之后,使用较大得元素对nums1[p3]进行填充,当 p1<0 时遍历结束,此时 nums2 中可能存在数据未拷贝完全
阅读全文
摘要:比较简单得题目,一次迭代可以得出结果 时间O(n),空间O(1) public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l3 = new ListNode(),l4=l3; while (l1!=null && l2!=
阅读全文
摘要:使用迭代得方法,用3个指针,分别指向后一个元素,当前元素和前一个元素, null->1->2,flow=null,curr=1,prev=2,迭代时将flow指向curr得next,再将flow指向curr, 最后将prev覆盖curr即可。时间O(n),空间O(1) public ListNode
阅读全文
摘要:1. 条件断点(suspend when 'true') 如果你不知道如何添加断点,只需点击左边面板(行号前面)断点即被创建。在调试界面中,“断点”视图会把所有被创建的断点列出来。 我们可以给它加一个布尔条件,也就是说,该断点会被激活并且如果布尔条件为真,就会执行该断点,否则将会跳过往下执行。 另一
阅读全文
摘要:本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正 1. 关于java中常用数据类型的长度 byte/1,char/2(因为java用的是Unicode编码,固定为2字节),short/2, int/4(当时大多数系统为32位系统,涉及到组原和操作系统相关知识,4字节有助于加快计算速度
阅读全文

浙公网安备 33010602011771号