自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 200题打卡

2022-04-21 16:47:59 171

原创 redis性能变慢排查

关于如何分析、排查、解决Redis变慢问题,我总结的checklist如下:1、使用复杂度过高的命令(例如SORT/SUION/ZUNIONSTORE/KEYS),或一次查询全量数据(例如LRANGE key 0 N,但N很大) 分析:a) 查看slowlog是否存在这些命令 b) Redis进程CPU使用率是否飙升(聚合运算命令导致) 解决:a) 不使用复杂度过高的命令,或用其他方式代替实现(放在客户端做) b) 数据尽量分批查询(LRANGE key 0 N,建议N<=100,查询全量数据建议

2022-04-20 20:13:23 625

转载 Redis性能变慢查询步骤

从文件系统和操作系统两个维度,介绍了应对 Redis 变慢的方法。梳理了一个包含 9 个检查点的 Checklist,希望你在遇到 Redis 性能变慢时,按照这些步骤逐一检查,高效地解决问题。1、获取 Redis 实例在当前环境下的基线性能。2、是否用了慢查询命令?如果是的话,就使用其他命令替代慢查询命令,或者把聚合计算命令放在客户端做。3、是否对过期 key 设置了相同的过期时间?对于批量删除的 key,可以在每个 key 的过期时间上加一个随机数,避免同时删除。4、是否存在 big

2022-04-20 20:10:37 470

原创 leecode 406. 根据身高重建队列

406. 根据身高重建队列 本题必须回顾,主要是数据结构方面迭代知识不熟,暂时不想看,等后期再复习吧class Solution { //本题需要重新回顾,倒是不难,难在对这些数据结构和重写方法不熟练,让我自己写绝对写不出来 public int[][] reconstructQueue(int[][] people) { //比较器,重写方法,若第一个数相等,就比较第二个数,第二个数小的排前面 //若第一个数不相等...

2022-03-18 21:59:54 370

原创 leecode 491. 递增子序列

491. 递增子序列 本题和子集||看起来是相似的,看起来可以用boolean数组判断是否重复,但是实际上本题不能这么做,因为本题不是有序数组,而是要判断是否有序,因此需要换个思路。做回溯类题最重要的是画图,画图难度少一大半,而且逻辑性很强class Solution { List<List<Integer>> res = new ArrayList<>(); LinkedList<...

2022-03-05 10:28:07 84

原创 leecode 90. 子集 II

90. 子集 II本题需要在子集1的基础上去重,集合中可以有重复,但是求得的所有子集不能有重复。属于树层去重,可以用used数组来表示是否重复过。class Solution { List<List<Integer>> res = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); b...

2022-03-05 09:26:22 208

原创 leecode 93. 复原 IP 地址

​​​​​​93. 复原 IP 地址本题需要画图具体判断,由于分支太多,直接剪枝符合要求的结果即可。class Solution { List<String> res = new LinkedList<>(); public List<String> restoreIpAddresses(String s) { if (s == null || s.length() == 0 || s.length() >.

2022-03-04 10:29:14 70

原创 leecode 131. 分割回文串

131. 分割回文串本题核心思想:具体可以看代码随想录解释,把这题最简化了。 最好理解:class Solution { List<List<String>> res = new ArrayList<>(); LinkedList<String> path = new LinkedList<>(); public List<List<String>> pa...

2022-03-04 08:57:08 139

原创 leecode 40. 组合总和 II

40. 组合总和 II 本题是组合总和的加强版,要求不能够有重复的集合,但是集合中可以有重复元素,第一想法是按照正常做法进行然后利用哈希表储存,但是这样做会超时,只能另寻他法,这里可以看看代码随想录的思想,利用一个新的boolean数组判断,具体如下:class Solution { List<List<Integer>> res = new ArrayList<>(); LinkedList<Integer...

2022-03-03 18:43:04 70

原创 leecode 39. 组合总和

​​​​​​39. 组合总和 经典回溯,但是本题是可以重复利用数字求和的,代码如下:class Solution { List<List<Integer>> res = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> combina...

2022-03-03 15:53:37 77

原创 leecode 17. 电话号码的字母组合

17. 电话号码的字母组合 本题进一步强化了回溯的做法,需要用到字符串相关API,挺头疼。class Solution { // 数字到号码的映射 private String[] map = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; // 路径 private StringBuilder sb = new StringBuilder(); // 结果集 ...

2022-03-03 15:07:48 137

原创 leecode 216. 组合总和 III

​​​​​​216. 组合总和 III 本题是力扣77.组合的升级版,原来是要求求出所有符合条件k和n的集合,本题要在上一题的基础上求出集合的和,符合条件的输出为集合,因此可以回溯算法。//普通回溯+递归:class Solution { List<List<Integer>> res = new ArrayList<>(); LinkedList<Integer> path = new LinkedList&...

2022-03-02 14:07:42 147

原创 leecode 77. 组合

​​​​​​77. 组合 本题是继二叉树后第一次接触回溯算法的的第一个算法题。具体可看代码随想录 回溯算法。class Solution {//ArrayList和LinkedList区别//前者基于数组实现,后者基于双链表实现//前者对搜索元素复杂度O(1),而插入删除开销较大;后者相反//但是如果在末尾插入元素,ArrayList需要开销相对较小,本题是直接在末尾添加path//而且ArrayList的内存使用量较小,所以用ArrayList List&...

2022-03-02 10:52:54 128

原创 leecode 108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 本题仍然是数组转二叉树的一种题型,不过这题转二叉搜索树会更方便些,和最大二叉树是同一类题型,需要用一个方法放置数组,和左右边界的位置。代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode()...

2022-03-01 10:17:05 124

原创 leecode 669. 修剪二叉搜索树

669. 修剪二叉搜索树 本题细节很多,需要重新回顾代码随想录-修剪二叉搜索树,代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = va...

2022-03-01 09:29:05 106

原创 leecode 450. 删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点 本题是删除搜索树中的指定值,和添加值比,却复杂很多,但是本题的具体逻辑我竟然能自己慢慢实现出来,第一次感觉到对递归理解加深了。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * ...

2022-02-28 20:29:14 112

原创 leecode 701. 二叉搜索树中的插入操作

701. 二叉搜索树中的插入操作本题是搜索树,需要用到条件,以下是迭代和递归两种做法:递归:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; }

2022-02-28 19:47:49 127

原创 leecode 235. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先本题是在leecode 236. 二叉树的最近公共祖先的基础上增加了一个条件:二叉搜索树。这样可以围绕搜索树改变思路。 第一种方法,仍然利用236题的思路可以求出来,但是没有用到条件。第二种方法,由于是搜索树,因此顺序是确定的,那么就可以不需要回溯,前中后三种遍历顺序也就都可以了。若当前节点值比p、q大,那么向左子树继续寻找,反之向右子树寻找。代码及优化如下:/** * Definition fo...

2022-02-28 18:48:55 178

原创 leecode 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先代码随想录/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { //本题需要利用二叉树的回溯,而后序遍历本身就是天然.

2022-02-26 15:41:51 214

原创 leecode 501. 二叉搜索树中的众数

501. 二叉搜索树中的众数 本题是一个二叉搜索树,遇到二叉搜索树最清楚的是用中序遍历,因为中序遍历直接由小到大排序,然后根据要求修改代码。本题需要找到众数,经过中序遍历后记录排序后的数组的最大众数,直接得到结果,但是代码实现比较麻烦。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tr...

2022-02-26 00:15:42 160

原创 leecode 530. 二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差 本题仍然是二叉搜索树,由于中序遍历搜索树是按照由小到大排列,因此只需要将树中序遍历,用一个pre树记录当前节点的前一个节点,然后判断结果大小,最终输出即可。这里pre容易搞错,以上图为例,当前节点为2时,我刚开始还以为pre是3,其实是1。因为中序遍历先把左子树节点遍历完以后再往回遍历,而pre记录的当前节点就是最小节点,从最小节点开始慢慢由小到大遍历。这里后期回顾要好好复习./** * Definition for a binary...

2022-02-24 12:16:29 236

原创 leecode 98. 验证二叉搜索树

​​​​​98. 验证二叉搜索树 这题用两种递归,首先想到的是用当前节点和左右节点的值比较,但是最后仍然失败了。主要是因为二叉搜索树要保证的是当前节点的左子树全部小于当前节点的值,右子树全部大于当前节点的值。如果只比较左右节点,有可能当前节点右子树的左节点比当前节点还小,但是仍然符合递归条件,如下是错误示例。class Solution { public boolean isValidBST(TreeNode root) { if(root == ...

2022-02-24 11:35:21 276

原创 leecode 617. 合并二叉树

​​​​​​617. 合并二叉树本体是操作两个二叉树,正常的递归做法。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * T...

2022-02-23 11:15:18 132

原创 leecode 113. 路径总和 II

113. 路径总和 II这题是112. 路径总和的变体,需要注意两个题的区别,112题是求二叉树是否存在一个与目标值相等的和,如果有相等的值,直接返回,不用管其他分支是否还有,因为这个树上已经存在一个与目标值相等的分支,因此这题不用遍历整个树;而本题是需要找到所有与目标值相等的分支,因此需要对整个树遍历,当遍历到符合目标值的时候,就将这个分支记录下来,直到整棵树遍历后再去看有多少结果,最终输出所有符合要求的树分支。/** * Definition for a binar...

2022-02-22 11:01:36 249

原创 leecode 105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 这个图表明了这个二叉树的遍历顺序,但是下标是按照左闭右闭原则,我的做法是左闭右开/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val...

2022-02-21 18:22:23 74

原创 leecode 106. 从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树'递归的还原过程:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int

2022-02-21 17:19:52 230

原创 leecode 112. 路径总和

​​​​​​112. 路径总和/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left

2022-02-18 11:36:26 162

原创 leecode 513. 找树左下角的值

513. 找树左下角的值迭代:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode l.

2022-02-17 12:15:34 149

原创 leecode 404. 左叶子之和

404. 左叶子之和本题注意是左叶子节点, 不是左节点,因此需要判断是否是左叶子节点,当一个节点的左节点不为空,左节点的左右节点都为空时,则为左叶子节点。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * Tre...

2022-02-15 11:36:45 131

原创 leecode 257. 二叉树的所有路径

257. 二叉树的所有路径第一种方法:递归。需要注意,原题答案需要输出 "->" ,因此需要用StringBuffer拼接。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int v...

2022-02-13 11:15:02 222

原创 leecode 110. 平衡二叉树

​​​​​​110. 平衡二叉树本题用自顶向下递归和自底向上递归两种方法,后一种方法是最优解。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val ...

2022-02-11 11:04:05 259

原创 leecode 222. 完全二叉树的节点个数

222. 完全二叉树的节点个数/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode l.

2022-02-10 11:13:23 303

原创 leecode 111. 二叉树的最小深度

111. 二叉树的最小深度 递归:注意:和二叉树的最大深度不同,并不是直接将最大值变为最小值,最后的节点左右子节点应都为空才是最小深度,只有一边为空的时候不是最小节点,需要向另一个节点延伸,直到找到左右子节点都为空的时候结束。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode ri...

2022-02-10 10:23:06 268

原创 leecode 559. N 叉树的最大深度

559. N 叉树的最大深度此题是二叉树最大深度的小升级版,递归和迭代都可以用二叉树稍微修改。递归需要注意,n叉树中的子树是children,不知道有多少子树,所以需要在判断子树不为空以后遍历root.children,对每个子树递归。/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} .

2022-02-10 09:07:48 309

原创 leecode 101. 对称二叉树

101. 对称二叉树二叉树实现的两种方法:递归、迭代。

2022-02-09 11:40:02 215

原创 leecode 226. 翻转二叉树

226. 翻转二叉树两种方法,递归和迭代,递归思想是将当前节点的子节点交换后调用自身方法继续交换两个子节点的子节点,迭代思想是利用层序遍历的思想,代码也类似。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNo

2022-02-07 11:25:35 867

原创 leecode 102. 二叉树的层序遍历

102. 二叉树的层序遍历本题仍然有两种做法,递归和迭代,详细见代码。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNod

2022-02-06 11:19:35 360

原创 leecode 二叉树的前中后序遍历

144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历两种方法来做,递归和迭代。递归注意结束条件,迭代注意入栈顺序,比如前序遍历需要先入栈根值取出后再入栈右子树和左子树,出栈时是左子树先出,这样就符合中左右的前序遍历方式。递归:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tree

2022-02-05 11:52:25 968

原创 leecode 347. 前 K 个高频元素

​​​​​​347. 前 K 个高频元素本题还是细节处理比较多,我不太熟悉小顶堆大顶堆,这个题花了一个多小时在搞基础,具体细节在代码部分。class Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < num...

2022-02-04 11:52:41 809

原创 leecode 150. 逆波兰表达式求值

150. 逆波兰表达式求值本题很容易想到用栈来解决,需要处理细节比较多,首先用Deque创建一个队列LinkedList作栈使用,其次需要想办法将数字放入,这里需要用一个n1和n2标记此时的出栈数字,然后对栈进行操作将原栈中数字修改成运算符操作后的结果。以上是我觉得做这题的难点,首先我不熟悉栈的创建(Deque<Integer> stack = new LinkedList<Integer>();),其次不知道如何让运算符不入栈(使用isNumber()方法,如果是运算.

2022-02-04 09:57:37 383

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除