- 博客(134)
- 收藏
- 关注
原创 Leetcode 1188 设计有限阻塞队列
(1)题点是队列的并发控制,因此需要引入锁(2)生产者消费者通过解耦,最好不要共用锁,拆分为写锁和读锁。
2024-11-24 00:14:01
270
1
原创 线程池吞掉异常的case:源码阅读与解决方法
有一天给同事CR,看到一段这样的代码你这段代码是利用并发降低RT对吧,如果func内部抛异常,你确定可以catch到吗可以啊, 为什么不可以(...不如你run一把,在func mock一个异常出来试试我靠还真是你可以用execute,改动比较小那么是为什么呢。
2024-06-17 22:16:04
912
原创 sql优化之利用聚簇索引减少回表次数:limit 100000,10
产品:我要对订单列表页做一个分页功能,每页10条数据,商家可以根据金额过滤订单功能演示时,产品点击第1000万页,页面因为接口超时空白,查看sql耗时10000ms技术:(汗流浃背)这么简单的sql怎么会超时,...
2024-06-15 19:15:13
453
原创 【Leetcode 42】 接雨水-单调栈解法
维持栈单调递减,一旦出现元素大于栈顶元素,就可以计算雨水量,同时。单调栈通常保存的是下标,用于计算距离。
2024-05-06 23:43:21
313
原创 【LeetCode 121】买卖股票的最佳时机
所谓代码的复杂性来源于业务的复杂性,如果能够想清楚业务实现逻辑,就能够轻松写出代码;假设当前是第i天,如何在第i天赚到最多的钱?需要在第i天之前以最低价买入股票;所以需要求出每一天之前的最低价,求最大差价。
2024-05-06 22:10:39
418
1
原创 【Leetcode 42】 接雨水
问题转化成了,如何用最短时间计算所有位置左侧最高点和右侧最高点,这是一个简单的动态规划问题,时间复杂度O(n)(1)需要将问题最小化,首先计算第i个位置最多容纳多少雨水(细长的一条水柱),然后求和就是总的雨水量;
2024-05-06 22:02:10
356
转载 【解决】修改idea.vmoptions导致idea无法启动
Users/用户名/Library/Application\ Support/JetBrains/IntelliJIdea2023.3。
2024-04-07 15:29:32
419
1
原创 【LeetCode 23】合并K个升序链表
题目描述:存在k个有序链表,实现多路归并。思路:与二路归并类似,需要每次从所有头结点挑选最小的连接到结果链表;二路归并直接比较两个链表的头即可,但是K路的话,每次需要比较K个,使用堆或者红黑树会比较好维护,采用PriorityQueue或者TreeSet。 public ListNode mergeKLists(ListNode[] lists) { if(lists==null||lists.length==0){ return null;
2020-09-03 15:09:19
230
原创 concurrent mode failure
【https://blog.youkuaiyun.com/yangguosb/article/details/79857844】concurrent mode failure是什么? CMS垃圾收集器特有的错误,CMS的垃圾清理和引用线程是并行进行的,如果在并行清理的过程中老年代的空间不足以容纳应用产生的垃圾(也就是老年代正在清理,从年轻代晋升了新的对象,或者直接分配大对象年轻代放不下导致直接在老年...
2020-04-02 17:26:12
5723
3
原创 经典的GC收集器组合
常用的组合为(1)Serial+Serial Old实现单线程的低延迟垃圾回收机制;(2)ParNew+CMS,实现多线程的低延迟垃圾回收机制;(3)Parallel Scavenge和Parallel Scavenge Old,实现多线程的高吞吐量垃圾回收机制;(4)另外,Serial Old是一款比较万能的老年代收集器。ParNew可以和Serial Old结合使用,Paral...
2020-04-02 15:21:57
521
原创 JVM初始大小和最大堆大小
可以用命令直接查询:java -XX:+PrintFlagsFinal -version | grep HeapSize或者使用java代码:Runtime.getRuntime().maxMemory();官方文档:1. client模式初始堆大小:物理内存的1/64,但最小是8MB。最大堆大小:在物理内存达到192MB之前,JVM最大堆大小为...
2020-03-31 21:37:05
4058
原创 HashMap的resize()过程简述版本
初始默认大小为16,默认负载阈值0.751. 如果oldCap已经超出最大容量。将Integer.MAX_VALUE赋给阈值,返回旧表;2. 如果oldCap以及oldCap*2是介于16和最大容量之间(多落在这个分支),oldCap*2得到新容量,oldThr*2得到新阈值;3. 如果oldCap==0并且oldThr>0,那么oldThr直接赋给newC...
2020-03-30 23:08:23
1311
原创 ArrayList添加元素扩容过程简述
size表示数组元素数量,length表示数组长度;minCapacity=size+1为最小容量(当前元素放进去最少需要size+1的容量)1. 判断初始状态。如果数组为初始状态,将初始容量(10)和最小容量之间的较大值赋值给minCapacity;2. 判断是否需要扩容。如果minCapacity超出了length,那么需要扩容;3. 设置扩容的容量。...
2020-03-30 22:14:06
749
1
原创 Java线程的状态;WAITING、TIMED_WAITING与BLOCKED的区别;Object.wait()和Thread.sleep()
1. Java线程的状态包括:NEW、READY、RUNNING、WAITING、TIMED_WAITING、BLOCKED2.WAITING、TIMED_WAITING与BLOCKED的区别:(1)WAITING:进入等待状态,方式:wait/join/park方法进入无限等待,通过notify/notifyAll/unpark唤醒;(2)TIMED_WAITING:与WA...
2020-03-30 14:48:11
12164
2
原创 【收集】java IO操作类的关系图
1. 按照操作类型(按照常用):缓冲、文件、基本类型、序列化、数组、管道、打印,以及字节流/字符流转换。也不太难记忆-.-【图片来自javaguide】2. 按照字节流/字符流:除了Filter开头的,其它为基础字节流或基础字符流;Filter开头的是装饰接口。3. 输入字节流(inputStream)的继承关系图(输出流类似)InputStream为抽象类,...
2020-03-29 18:46:43
408
原创 try的return和finally相关问题
(1)try块的return和finally的执行顺序。try执行之后,return之前会跳转到finally执行代码。(2)是否有可能执行了try不执行finally?如果在try调用了system.exit(0),就不会执行到finally。(3)finally何时会影响返回值?如果返回值是基础类型,finally中的修改不会影响try的return。以下代码输出为10....
2020-03-28 22:52:34
494
原创 【LeetCode 406】根据身高重建队列
思路:来自力扣官方(因为没看懂题目,所以...直接看了答案)【https://leetcode-cn.com/problems/queue-reconstruction-by-height/solution/gen-ju-shen-gao-zhong-jian-dui-lie-by-leetcode/】(1)对于两个人i和j,如果i的身高大于j的身高,那么j的站位对于i是没有任何影响的...
2020-03-27 17:49:51
365
原创 【LeetCode 148】 排序链表
题目要求:在O(nlogn)的时间复杂度与常数空间复杂度对链表排序。思路:归并排序。相关问题:如何快速确定链表的中间结点。 public ListNode sortList(ListNode head) { if(head==null||head.next==null) return head; //快慢指针拆分为两个链表 //...
2020-03-27 16:01:28
117
原创 【LeetCode 105】从前序与中序遍历序列构造二叉树
思路:观察发现,首先从preorder获得根结点,从inorder找到根结点所在位置index,inorder[i]之前的内容为左子树,之后的内容为右子树。 public TreeNode buildTree(int[] preorder, int[] inorder) { TreeNode root=buildTreeCore(preorder, 0, preorder...
2020-03-27 15:24:28
115
原创 【LeetCode 64】 最小路径和
思路:1. 简单递归,时间复杂度较高,因为会重复计算。 public int minPathSum(int[][] grid) { int n=grid.length; int m=grid[0].length; return minPathSumCore(grid,n,m,0,0); } ...
2020-03-22 21:30:10
233
原创 【LeetCode 96】不同的二叉搜索树
思路:动态规划。依次选择每一个元素作为根结点,假如选择第i个元素作为根结点,树的可能数量=(i-1)个元素构成左侧搜索树的数量*(n-i)个元素构成的右侧搜索树的数量。因为二叉搜索树的构成仅与元素的大小有关系,所以{1,2,3}与{4,5,6}构成的二叉搜索树的数量是一样的,因此中间结果可重用。 public int numTrees(int n) { int[...
2020-03-22 17:17:44
287
原创 【LeetCode 136】只出现一次的数字
简单题目,采用异或,直接上代码: public int singleNumber(int[] nums) { if(nums==null||nums.length==0) return 0; int answer=nums[0]; for(int i=1;i<nums.length;i++){ answer...
2020-03-22 15:50:38
118
原创 【LeetCode 238】除自身以外数组的乘积
思路:求解除自身以外的所有数字的乘积,就是求解自身左侧的乘积与右侧乘积的乘积,可以分为两个子问题:自左向右求解累乘结果;自右向左求解累乘结果。已经计算的结果可以重复使用。代码如下: public int[] productExceptSelf(int[] nums) { if (nums == null || nums.length == 0) { ...
2020-03-22 15:47:06
108
原创 【LeetCode 48】 旋转图像
思路:转置+镜像 public void rotate(int[][] matrix) { if(matrix==null) return; int n=matrix.length; //转置 for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ ...
2020-03-22 15:08:59
133
原创 【LeetCode 114】二叉树展开为链表
思路:通过观察可以发现,所谓展开就是按照前序遍历将二叉树重新连接,使用递归。首先记录root的右子树;对root的左子树递归展开,并返回根节点,连接到root的右边;对root的右子树递归展开,连接到当前链表的末尾。 public void flatten(TreeNode root) { flattenCore(root); } pu...
2020-03-22 14:40:46
449
原创 【LeetCode 206】翻转链表
1. 循环写法 public ListNode reverseList(ListNode head) { if(head==null||head.next==null) return head; ListNode p1=head,p2=head.next,p3=p2.next; head.next=null; whi...
2020-03-21 23:23:41
111
原创 【LeetCode 39】组合总和
极为经典的回溯题目思路:套用模板即可,需要说明的是:1. 循环的起点,元素可以重用,并且不允许答案重复,起点选择当前元素。2. 终止条件:当target等于0,那么就存在一组解;如果target不为0,需要判断target与可用元素最小值(就是当前元素),判断是否还可能出现解,不可能就进行剪枝,已经包括了target被减为负值的情况。 public List<Li...
2020-03-21 22:42:08
106
原创 【LeetCode 94】使用迭代返回二叉树的中序遍历结果
常用递归问题的非递归算法,常常使用栈书写。第一种:使用栈的非递归中序遍历算法思路:中序遍历的直观理解。入栈操作:跟结点出发,将left结点不断添加到栈,到达最后一个结点之后,开始执行出栈操作;出栈操作:检查栈顶结点是否存在右子树,如果不存在,直接将当前结点弹出并且记录结果;如果存在右子树,在弹出当前结点之后,需要将右子树入栈。 public List<Inte...
2020-03-21 21:56:42
148
原创 【LeetCode 104】二叉树的最大深度
简单题目,代码如下:import java.lang.Math;class Solution { public int maxDepth(TreeNode root) { if(root==null) return 0; return 1+Math.max(maxDepth(root.left),maxDepth(root.right)); ...
2020-03-21 15:40:45
83
原创 【LeetCode 22】括号生成
深搜+剪枝的两种解法:1. 自上而下的深搜遍历与检查,一开始持有n个左括号与n个右括号,每次选择向路径中加入左括号或右括号,当某一种括号剩余量为0剪枝。对可能的结果使用栈检查合法性。效率比较低下,因为检查的过程耗费时间。 public List<String> generateParenthesis(int n) { List<String...
2020-03-21 15:22:41
115
原创 【LeetCode 226】翻转二叉树
题目简单,直接上代码。 public TreeNode invertTree(TreeNode root) { if(root==null||(root.left==null&&root.right==null)){ return root; } TreeNode tmp=root...
2020-03-20 22:28:09
104
原创 ArrayList<Integer>的remove(Object)与remove(index)方法调用时候会选择哪一个
有一天写代码,遇到ArrayList<Integer>的remove(Object)与remove(index)方法调用时候会选择哪一个的问题,其实并不复杂,这里还是进行记录。例如:ArrayList<Integer> list=new ArrayList<>();int a=1;list.add(a);list.remove(a);此时会报...
2020-03-20 21:44:58
1167
原创 【LeetCode 338】比特位计数
这是一个动态规划题目,主要思路就是利用已经计算的结果获得当前求解的结果,递推式通常通过反推获得。方法1:获得一个比当前数字小的数字,最简单的方法就是右移。查阅(当前数字>>2)的结果,如果当前数字是偶数,直接返回,如果当前数字是奇数,需要加上最低位的一个1。方法2:通过列举的方法寻找规律。...010001100100011101001000...
2020-03-19 22:51:01
106
原创 【LeetCode 461】汉明距离
思路:简单题目,一笔带过。异或然后循环数1的数量。 public int hammingDistance(int x, int y) { int answer=0; int XorAnswer=x^y; int point=1; for(int i=0;i<32;i++){ ...
2020-03-19 12:04:13
84
原创 【LeetCode 78】子集
第一种:回溯解法 public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> answer=new ArrayList<>(); if (nums == null || nums.length == 0) { ...
2020-03-19 11:11:18
128
原创 回溯总结-惭愧惭愧
关于回溯有一个很好的博客【https://leetcode-cn.com/problems/subsets/solution/xiang-xi-jie-shao-di-gui-hui-su-de-tao-lu-by-reedf/】回溯法有一个书写模板,大致如下:void func(index, currAns, answer) if(达到终止条件){ //判断当前结果是否符合条件 ...
2020-03-18 11:44:44
138
原创 idea ultimate调整字体
三个位置:1. appearance&behavior的Appearance顶部,勾选use custom font之后可以设置idea边框的字体;2. editor的font,可以设置代码字体格式;3. editor的color scheme下面的color scheme font与console font,可以覆盖以上字体设置。另外:如果设置后点击apply无效,...
2020-01-09 11:15:19
308
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人