随笔分类 -  集合

巧用java集合
摘要:基于s的范围暴力破解的话必然超时 这里采用滑动窗口的方案来处理 我们维护一个队列,依次将字符压入队列,当新遇到的字符 已经在队列中时,我们就需要将队列中已出现的位置前的字符全部弹出 来保证队列中永远不存在重复字符,同时每次队列更新后计算队列长度即可。 时间O(n),空间O(z)(与字符串s的离散度相 阅读全文
posted @ 2021-05-26 18:54 jchen104 阅读(50) 评论(0) 推荐(0)
摘要:这题的难点在于怎么判断查询到的2个节点没有同一个父节点,因此我们每次遍历的 时候,就记录下当前节点的左右子节点,然后对下一层做判断,这样每一层遍历的时候 就能得出下一层的结果 时间O(n),空间O(n) 1 public boolean isCousins(TreeNode root, int x, 阅读全文
posted @ 2021-05-14 11:08 jchen104 阅读(56) 评论(0) 推荐(0)
摘要:方案一、使用BFS遍历每个元素,遍历时不停检测是否存在2个元素和相加满足要求 时间O(n),空间O(n) 1 public boolean findTarget(TreeNode root, int k) { 2 if(root==null) return false; 3 Set<Integer> 阅读全文
posted @ 2021-05-12 10:14 jchen104 阅读(77) 评论(0) 推荐(0)
摘要: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 阅读全文
posted @ 2021-04-28 14:35 jchen104 阅读(52) 评论(0) 推荐(0)
摘要:方法一:使用set来存储2个数组的元素 时间O(m+n),空间O(m+n) public int[] intersection(int[] nums1, int[] nums2) { if (nums1==null || nums2==null || nums1.length==0 || nums2 阅读全文
posted @ 2021-04-21 10:48 jchen104 阅读(58) 评论(0) 推荐(0)
摘要:根据回文的定义,有2种可能,(1)字符串中所有字符出现次数为偶数,(2)字符串中只有一个字符出现次数为奇数(在中间位置) 所以我们只需要统计整个字符串中是否存在1个以上出现次数为奇数的元素 时间O(n),空间O(s)(s为整个字符串的离散度) public boolean canPermutePal 阅读全文
posted @ 2021-04-19 09:48 jchen104 阅读(79) 评论(0) 推荐(0)
摘要:广度优先遍历,依次访问2颗树的每一个节点并经行比较 时间O(n),空间O(n) public boolean isSameTree(TreeNode p, TreeNode q) { Deque<TreeNode> queue1 = new LinkedList<TreeNode>(); Deque 阅读全文
posted @ 2021-04-16 17:44 jchen104 阅读(38) 评论(0) 推荐(0)
摘要:感受轮子的快乐,时间O(n),空间O(n) public boolean containsDuplicate(int[] nums) { Set<Integer> set = new HashSet<Integer>(); for(int num:nums){ if(!set.add(num)){ 阅读全文
posted @ 2021-04-16 17:24 jchen104 阅读(24) 评论(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 阅读(54) 评论(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 阅读(75) 评论(0) 推荐(0)
摘要:老规矩,使用队列辅助完成广度优先遍历操作。 从根节点开始将左右孩子压入队列。 然后不停的从队列出去首2位元素(left,right)进行比较, 如相等,再将left节点的left节点与right节点的right节点。 这里有点绕人,需要结合图片理解 在比较完根节点的2个子孩子2和2后,根据镜像的性质 阅读全文
posted @ 2021-04-08 11:39 jchen104 阅读(52) 评论(0) 推荐(0)
摘要:翻转二叉树,2种方案,递归与非递归 (个人更喜欢非递归的方案,大多数情况下非递归的迭代都拥有更低的时空间复杂度,当然也存在 傅里叶快速变换那种小而美的递归方案,见仁见智吧) 1. 递归(深度优先遍历方案) 此方案中,我们会直接从最顶层父节点,一路递归至最左侧叶子节点, 然后再递归至其父节点的右孩子, 阅读全文
posted @ 2021-04-06 18:28 jchen104 阅读(240) 评论(0) 推荐(0)
摘要:利用map的key,value一一对应的特点来实现 时间O(n),空间O(n) public int[] twoSum(int[] nums, int target) { HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); f 阅读全文
posted @ 2021-03-29 10:29 jchen104 阅读(58) 评论(0) 推荐(0)
摘要:利用哈希表的键值对属性和堆的先进后出属性, 先将括号建立键值对,然后迭代时遇到键值对内元素 则弹出,否则继续压入堆内。迭代完毕后,若堆内不为空则无效,反之则有效。 时间O(n),空间O(n)(本题的map内键值对是固定的3组,所以空间是固定的,可以忽略不计) public boolean isVal 阅读全文
posted @ 2021-03-29 10:28 jchen104 阅读(46) 评论(0) 推荐(0)
摘要:根据题意,异位词的意思为2个字符串中相同元素出现相同次数 2次迭代,第一次迭代计算每个元素出现的次数,每次+1 第二次迭代将每个元素,每次-1,。第二次迭代完成以后, 若异位词成立,则每个key对应的value都应该为0,否则便不成立。 时间O(n),空间O(m),m为2个字符串s和t的离散度 pu 阅读全文
posted @ 2021-03-29 10:23 jchen104 阅读(65) 评论(0) 推荐(0)
摘要:利用hashmap的key唯一属性来实现,迭代一遍, 以迭代到的字符为key,计算字符出现的次数。 第二次迭代的时候判断该字符是否只出现了一次。 时间O(n),空间O(m),m为字符串s内元素的离散程度,比如 s的范围是26个小写字母,m就是26 public int firstUniqChar(S 阅读全文
posted @ 2021-03-29 10:18 jchen104 阅读(51) 评论(0) 推荐(0)