![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每日刷题
奶油蘑菇汤
这个作者很懒,什么都没留下…
展开
-
LC684冗余连接 - 并查集
题目含义:找出图中的环class Solution { public int[] findRedundantConnection(int[][] edges) { //1. 把所有parent节点的值设为-1 int len = edges.length; int[] parent = new int[len + 1];//顶点从1开始 Arrays.fill(parent, -1); int[] res原创 2021-03-21 20:36:45 · 119 阅读 · 0 评论 -
LC210 - BFS拓扑排序
题目现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。思路包含 N个节点的有向图 GG,拓扑排序,判断是否有环,若有环则返回空数组参考解题:https://leetcode-cn.com/problems/co原创 2021-03-20 13:26:14 · 103 阅读 · 0 评论 -
LC785 - 判断二分图 - 遍历树/dfs/bfs
https://www.jianshu.com/p/2226dbe98e06public void dfs(int node, int[][] graph) { help[node]=1;//标记已访问 //遍历邻接点 for (int i = 0; i < graph[node].length; ++i) { if (help[i] == 0 && i != node && graph[node原创 2021-03-14 22:06:14 · 143 阅读 · 0 评论 -
LC378 - 有序矩阵中第K小的元素 - 优先队列/比较器
题目有序矩阵中第K小的元素matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15]],k = 8,返回 13。思路方法一:直接排序class Solution { public int kthSmallest(int[][] matrix, int k) { //方法1 直接排序 int rows = matrix.length; int cols = matrix原创 2021-01-24 14:04:45 · 127 阅读 · 0 评论 -
LC23 - 合并K个升序链表 - 归并排序/合并k个有序数组/链表/优先队列/比较器/尾插法
题目合并K个升序链表思路子问题 LC21 合并2个有序链表(递归)/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this原创 2021-01-17 18:31:56 · 152 阅读 · 0 评论 -
LC696 - 计数二进制子串 - 统计每个数字/字符连续出现的次数
题目LC696思路https://www.cnblogs.com/cnoodle/p/13469190.html思路非常规题知识点新建一个ArrayList(长度不确定的数组),来统计每个数字/字符连续出现的次数普通数组 counts[i]ArrayList counts.get(i)代码class Solution { public int countBinarySubstrings(String s) { //数组,长度未知,统计每个数字连续出现的次数原创 2021-01-07 20:40:49 · 155 阅读 · 0 评论 -
LC205 - 同构字符串 - 桶排序/计数排序
题目给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。输入: s = "egg", t = "add"输出: true输入: s = "foo", t = "bar"输出: false思路维护两个数组由于ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256种可能的字符。大小写字符一共是256个,所以要维持长度为256的数组index为s,t中的字符,数组存储的value是该字符出现的次数,依次遍历原创 2020-12-27 01:18:29 · 133 阅读 · 0 评论 -
LC409 - 最长回文串 - HashMap记录每个字符出现的次数
1. 题目给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。输入:"abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。2. 思路用HashMap记录每个字符出现的次数如果某字母有偶数个,因为偶数有对称性,可以把它全部用来构造回文串;但如果是奇数个的话,并不是完全不可以用来构建,也不是只能选最长的那个,而是只要砍掉1个,剩下的变成偶数就可以全部计入了。也就是假设它出现了 v 次,我们可以使用该字符 v /原创 2020-12-16 17:36:58 · 89 阅读 · 0 评论 -
LC242 - 两个字符串包含的字符是否完全相同 - hashmap
1. 题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。(两个单词包含相同的字母,但是次序不同)输入: s = "anagram", t = "nagaram"输出: true输入: s = "rat", t = "car"输出: false2. 思路可以用 HashMap 来映射字符与出现次数,然后比较两个字符串出现的字符数量是否相同。3. 知识点遍历数组,用哈希映射来存储每个数出现的次数put(), getOrDefault()hashmap相原创 2020-12-14 21:06:17 · 176 阅读 · 0 评论 -
字符串中单词的翻转 - split()/StringBuilter()/append拼接
1. 题目翻转字符串里的单词s = "I am a student"Return "student a am I"2. 思路参考: link.方法1:spilit()利用正则表达式的split()方法将字符串分解成单词存放在数组中,然后将数组逆序输出方法2:(没有用代码实现)先将整个字符串的字符翻转,再将单个词的字符翻转步骤:字符串反转单词翻转去掉多余空格3. 知识点trim()的作用是去掉字符串两端的多余的空格split() 根据匹配给定的正则表达式来拆分字符串St原创 2020-12-13 22:57:25 · 163 阅读 · 0 评论 -
BCZM2.17 - 字符串循环移位 - toCharArray()/字符串翻转
题目s = "abcd123" k = 3Return "123abcd"将字符串向右循环移动 k 位思路假设要把数组序列abcd123右移3位变成123abcd,比较移位前后数组序列的形式,可以看出有两段序列的顺序是不变的,abcd和123,可以把这两段看作两个整体,右移3位,就是把数组的两部分交换一下。设计的算法步骤如下:逆序数组子序列abcd变为dcba逆序数组子序列123变为321全部逆序,数组序列由dcba321变为123abcd知识点string.toCharArra原创 2020-12-13 16:20:43 · 168 阅读 · 0 评论 -
BCZM3.1 - 字符串循环移位包含
题目给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。s1 = AABCD, s2 = CDAAReturn : true思路s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。知识点字符串拼接用+是否包含字串:String.contains(substring)代码public static boolean stringContain(String s1, String s2) {原创 2020-12-07 21:17:25 · 164 阅读 · 0 评论 -
LC594 - 最长和谐序列 - HahMap
题目和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。思路先遍历数组,用哈希映射来存储每个数出现的次数再遍历HashMap, Math.max迭代最大值知识点Map.getOrDefault()方法...原创 2020-12-07 20:09:59 · 144 阅读 · 0 评论 -
LC503 - 循环数组中比当前元素大的下一个元素 - 双重循环/单调栈
题目给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1示例:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。方法1:双重循环class Solution { pub原创 2020-11-28 14:43:00 · 122 阅读 · 0 评论 -
LC739-数组中元素与下一个比它大的元素之间的距离-双重循环/单调栈
题目请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。方法1:双重循环定义两个指针i,j,若T[j]>T[i], 则输出下标差注意:因为int是java的基本数据类型,它的默认值是0class Soluti原创 2020-10-24 18:59:02 · 245 阅读 · 0 评论 -
LC20 - 有效的括号 - Deque/HashMap/字符处理
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。tips匹配要想到HashMapMap<Character, Character> map = new HashMap<>();HashMap的几项操作map.put('}','{');map.put(']','[');map.put(')原创 2020-10-19 14:18:42 · 144 阅读 · 0 评论 -
LC445-两数相加-链表/栈/头插法
题目给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 8 -> 0 -> 7难点本题的主要难点在于链表中数位的顺序与我们做加法的顺序是相反的,为了逆序处理所有数位,我们可以使用栈:把所有数字压入栈中,再依次取出相加。最后使用头插法记录每一位的val,返回此链表头插法的主要步骤:原创 2020-09-17 22:24:12 · 103 阅读 · 0 评论 -
LC19- 删除链表的倒数第N个节点-双指针&哑节点
题目:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.什么情况用到哑节点?哑结点 可以用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部,如果删除了头节点,那我们用什么来返回链表?ListNode dummy = new ListNode(0);dummy.next = head;···return dummy.next;/** * Definition原创 2020-09-13 14:53:09 · 135 阅读 · 0 评论 -
LC160-单链表相交-双指针/hashset
题目:找到两个单链表相交的起始节点方法1:双指针,双指针分别指向headA和headB思路:若相交,链表A: a+c, 链表B : b+c.a+c+b+c = b+c+a+c 。则会在公共处c起点相遇。若不相交,a +b = b+a 。因此相遇处是NULL。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN原创 2020-09-07 23:19:35 · 106 阅读 · 0 评论 -
LC108 有序数组➡高度平衡BST
高度平衡:二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1思想:要高度平衡,则数组最中间的数成为root,左右子树分别递归,区间分治求数组中点的下边:int mid = left + (right - left) / 2, 避免溢出如果数组长度为奇数,则下标mid为最中间的数如果数组长度为偶数,则下标mid为中间偏左的数class Solution { public TreeNode sortedArrayToBST(int[] nums) { //区间分治原创 2020-08-26 21:50:35 · 99 阅读 · 0 评论 -
LC235&236 - 二叉树公共祖先 - 递归
LC235 二叉搜索树的公共祖先BST特性,左<根<右思路:如果 p<root<q 或者 q<root<p, 则公共祖先为root如果 p<q<root 或者 q<p<root, 则递归为f(root.left,p,q)同理,递归为f(root.right,p,q)/** * Definition for a binary tree node. * public class TreeNode { * int val; *原创 2020-08-25 23:23:17 · 104 阅读 · 0 评论 -
LC538 二叉搜索树—累加树
题目 5 / \ 2 13变为 18 / \ 20 13思路BST中序遍历[2,5,13]逆中序遍历[13,5,2]进行累加[13,5+13,5+13+2]/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tre原创 2020-08-21 23:28:39 · 203 阅读 · 0 评论 -
LC230-二叉搜索树中第K小的元素-中序遍历
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。BST(Binary Search Tree)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。看到二叉搜索树,应该立刻想到它的一个性质,它的中序遍历输出的是一个升序数组。 4 / \ 2 5 / \ 1 3中序:左-根-右顺序:1-2-3-4-5思原创 2020-08-19 01:15:16 · 151 阅读 · 0 评论 -
LC337-打家劫舍Ⅲ-递归
题目间隔遍历求值最大讲解视频https://www.bilibili.com/video/BV16E41187TP?from=search&seid=2318345313049362035思路每一个节点分成两种情况doRobnotRob这两个状态用两个HashMap来实现, value表示能够偷取的最大金额 Map<TreeNode,Integer> doRob= new HashMap<>(); Map<TreeNode,Integer>原创 2020-08-09 01:44:40 · 155 阅读 · 0 评论 -
LC687-最长同值路径-递归-没有想通
题目:(没做完)给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。*这条路径可以经过也可以不经过根节点。*两个节点之间的路径长度由它们之间的边数表示。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }原创 2020-08-06 23:50:06 · 109 阅读 · 0 评论 -
LC111-二叉树的最小深度-递归
题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例 3 / \ 9 20 / \ 15 7返回的最小深度是2 1 / 2 返回的最小深度是2思路分5种情况root为空,返回0root左右子树均为空,返回1root左子树为空,右子树不为空,返回右子树的最小深度+1root右子树为空,左子树不为空,返回左子树的最小深度+1左右子树均不为原创 2020-08-03 23:30:57 · 132 阅读 · 0 评论 -
LC101-判断是否是对称二叉树-递归&迭代
题目:给定一个二叉树,检查它是否是镜像对称的。思路:判断二叉树是否对称若 root == null, 直接返回 true;否则,判断 root.left 与 root.right 这两棵子树是否对称:判断 root.left 与 root.right 这两个节点的值是否相等判断 root.left 的左子树与 root.right 的右子树是否对称判断 root.left 的右子树与 root.right 的左子树是否对称递归class Solution { publi原创 2020-08-01 23:28:30 · 201 阅读 · 0 评论 -
LC572-是否包含子树-递归
题目检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。思路如果包含分为3种情况s的左子树包含ts的右子树包含ts == tclass Solution { public boolean isSubtree(TreeNode s, TreeNode t) { if(s == null && t == null){ return true; }原创 2020-08-01 01:22:40 · 62 阅读 · 0 评论 -
LC437-路径总和Ⅲ-双重递归
题目给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。(注意)路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)二叉树 递归遍历 模板void traverse(root) { if (root == null) return; traverse(root.left); traverse(root.right);}这道题用到了双重递归第一层递归,pathSum() 遍历所有节点,将3部分的路原创 2020-07-29 23:07:16 · 196 阅读 · 0 评论 -
LC112-路径总和-递归
题目给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。例子:给定如下二叉树,以及目标和 sum = 22 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5-&g原创 2020-07-29 14:43:07 · 159 阅读 · 0 评论 -
LC617-合并二叉树-递归
题目合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。输入: Tree 1 Tree 2 1 2 / \ / \原创 2020-07-29 12:10:55 · 136 阅读 · 0 评论 -
LC226-翻转二叉树-递归
解题:递归,翻转二叉树=翻转的左子树+翻转的右子树+左右翻转一开始写了while循环while(root != null),很容易超时, 逻辑也错了class Solution { public TreeNode invertTree(TreeNode root) { if(root == null){ return null; } TreeNode leftInvertTree = invertTre原创 2020-07-29 10:58:31 · 101 阅读 · 0 评论 -
LC543-二叉树的直径-递归
题目一棵二叉树的直径长度是任意两个结点路径长度中的最大值。( 这条路径可能穿过也可能不穿过根结点。)例: 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。解题最大直径 = max(任意一个节点的左子树深度+右子树深度)利用深度优先求树的高度的递归方法,遍历每个节点,迭代max值就行。class Solution {原创 2020-07-29 00:38:40 · 132 阅读 · 0 评论 -
LC110-判断平衡二叉树-递归
题目本题中一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true解题:平衡二叉树满足两个条件它的左右子树皆平衡左右子树的高度差不过超过1代码未优化class Solution { public boolean isBalanced(TreeNode root) { if(ro原创 2020-07-28 21:59:35 · 156 阅读 · 0 评论 -
LC102-二叉树的层序遍历-队列
示例:二叉树:[3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]queue用到的方法queue.offer()queue.poll()Queue 中 add() 和 offer() 区别:Queue 中 add() 和 offer()都是用来向队列添加一个元素。在容量已满的情况下,add() 方法会抛出IllegalStateExc原创 2020-07-27 23:54:09 · 88 阅读 · 0 评论 -
JZ7-重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。样例前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7根节点为:preorder[0]根节点在中序中的位置 :HashMap<Integer, Integer> inOrderMap = new Has原创 2020-07-26 16:07:03 · 196 阅读 · 0 评论 -
LC55-Day8-二叉树中序遍历-递归/非递归
前序遍历:先访问根节点——左子树——右子树。中序遍历:先访问左子树——根节点——右子树。后序遍历:和前面差不多,先访问树的左子树——右子树——根节点。二叉树的序列化遵循层序遍历的原则,”#“代表该位置是一条路径的终结比如,给出的二叉树为{1,#,2,3},它的中序遍历为[1,3,2].Java ArrayList创建ArrayList变量ArrayList<Integer> list = new ArrayList<>(); 为ArrayList变量赋值fo.原创 2020-07-22 00:44:20 · 138 阅读 · 0 评论 -
JZ5-Day6-两个栈实现一个队列
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解push()就正常入栈,pop() 就先将stack1中的元素压入stack2,然后pop stack2出栈do while循环:先执行循环体,直到条件的表达式为false。stack常用函数top()push(object obj)pop()empty()size()public class Solution { Stack<Integer> stack1 = new S原创 2020-07-18 14:59:13 · 69 阅读 · 0 评论 -
JZ9-Day5-青蛙跳台阶
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解f(n)=f(n-1)+f(1)=f(n-2)+f(2)=f(n-3)+f(3)…所以 f(n)=f(n-1)+f(n-2)+……f(1)public class JZ9 { public static int JumpMethods(int n) { if (n<=0) return 0; if (n==1) return 1; int method=原创 2020-07-18 01:14:57 · 94 阅读 · 0 评论 -
JZ38-Day3-求二叉树的深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。方法1:递归求一棵树的深度,就是通过比较它的左右子树的深度,若右子树深度深,则这棵树深度为右子树深度+1public class JZ38 { //初始化treeNode这种结构 public class TreeNode { int val; TreeNode left = null; TreeNode right = null;原创 2020-07-16 00:14:50 · 87 阅读 · 0 评论