自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并查集(Union Find)

并查集(Union Find)知乎上这篇文章写得挺好的,并查集详细介绍朴素并查集模板public class UnionFind { // int INF = 10000010; int[] p = new int[INF]; int n; public void init(int n) { // n为可用结点总数, this.n = n; for (int i = 0; i < n; i ++

2021-04-10 14:15:09 126

原创 AcWing数学知识

AcWing数学知识质数试除法O(n)O(\sqrt{n})O(n​)public static boolean isPrime(int x) { if (x < 2) return false; for (int i = 2; i <= x / i; i ++) { if (x % i == 0) return false; } return true;}分解质因数O(n)O(\sqrt{n})O(n​)public static

2021-08-09 23:05:25 326

原创 LeetCode 684. 冗余连接 Redundant Connection(Java)

0684. 冗余连接 Redundant Connection(Medium)##Union Find##并查集并查集可以维护无向图的联通分量对边数组中每条边进行遍历每条边的两个端点,查找其所属的联通分量若两端点所属联通分量不相同,代表两端点不连通,联通两端点后也不会形成环若两端点所属的联通分量相同,两端点联通,联通两端点后会行程环,该边就是形成环需要删去的最后的边若所有边都不成环,则返回空数组时间复杂度:O(n)O(n)O(n)将并查集操作复杂度视作O(1)O(1)O(1)

2021-05-15 17:27:43 185

原创 TLAB简单介绍

TLAB简单介绍定义TLAB(Thread Local Allocation Buffer)线程本地分配缓存,线程专用的分配区域TLAB为多线程环境下分配内存提高效率Java在new对象时,大部分对象在堆上TLAB分配,有一部分在栈上分配或者是在堆上直接分配,可能在Eden区也可能在老年代。某些GC算法,可能直接在老年代上分配,例如G1 GC中的humongous allocation(大对象分配),在对象超过Region一半大小的时候,直接在老年代的连续空间分配单线程应用采用**bump-th

2021-05-13 11:56:52 637

原创 MySQL多版本控制MVCC

MySQL多版本控制MVCCInnoDB相较于MyISAM,InnoDB支持事务,支持行级锁,脏读、不可重复读、幻读脏读:一个事务中一个操作读到了另一个未提交事务所更新的数据不可重复度:在一个事务中,对同一数据的访问得到不同值,原因是在两次访问期间该数据被其他事务更改并提交事务幻读:在一个事务中,采用相同的筛选条件查询数据,两次查询的行数记录不一样,原因是另一个事务在两次查询期间插入新行,且该数据符合where从句的筛选条件,并且该插入数据的事务提交。以上三种问题,InnoDB可以提供事务间

2021-05-12 16:09:45 133

原创 Redis缓存异常

Redis缓存异常缓存和数据库不一致情况一致性的含义缓存中有数据,缓存的数据值需要和数据库中的值相同缓存中没有数据,数据库中的值必须是最新值根据是否接受写请求,可以将缓存分成写缓存和只读缓存对于读写缓存,修改数据时,对缓存和数据库都需要修改,因此需要指定写回策略同步直写策略:写缓存时,也同步写数据库,缓存和数据库中的数据一致;异步写回策略:写缓存时不同步写数据库,等到数据从缓存中淘汰时,再写回数据库。使用这种策略时,如果数据还没有写回数据库,缓存就发生了故障,那么,此时,数据库就没有最

2021-05-10 20:43:50 818 3

原创 LeetCode1856.子数组最小乘积的最大值 Maximum Subarray Min-Product(Java)

LeetCode1856.子数组最小乘积的最大值 Maximum Subarray Min-Product(Java)##Binary Search##, ##Dynamic Programming##, ##Sort##, ##Union Find##, ##Queue##, ##Dequeue##最小乘积定义为这个数组中最小值乘以数组的和,题目求数组中非空子数组的最小乘积则该最小乘积由非空子数组中最小值、和子数组的和决定单调栈+前缀和参考LeetCode84遍历数组中的所有元素,假定当前元素

2021-05-10 15:25:30 207

原创 LeetCode 1854.人口最多的年份 Maximum Population Year(Java)

##1854.人口最多的年份Maximum Population Year(Easy)##Array##暴力枚举枚举每一年year包含的人口,过程为遍历整个数组logs,对某个人log,若log[0] <= year && log[1] - 1 >= year则判断这个人属于该年包含的人口时间复杂度:O(n∗m)O(n * m)O(n∗m),n为年龄跨度,m为人口总数差分法考虑一般情况,每年都有人出生的去世diff[i] = m - n表示第i年有m个人出生,n个人

2021-05-09 22:14:35 208

原创 Redis切片集群

Redis切片集群当Redis实例保存的键值对数量过大时,使用一次RDB进行持久化时,Redis会fork子进程来完成该操作,fork操作的时间开销与实例数据量大小呈正相关关系,fork操作会阻塞主进程。数据量越大,fork操作造成的主线程阻塞时间越长,Redis相应因此变慢考虑更为合理的方案解决Redis存储大容量数据切片集群,也称分片集群,启动多个Redis实例组成一个集群,将受到的数据划分成多份,每一份都用一个实例存储数据切片何实例的对应分布关系Redis Cluster方案采用哈希槽(H

2021-05-08 23:20:08 185 1

原创 LeetCode 1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Java)

1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Hard)##DFS##采用回溯、剪枝每项工作都有可能分给不同的工人,因此采用回溯法枚举所有可能的情况,并更新可能的最短的最大工作时间ans,对于不可能比ans小的最大工作时间的情况,直接剪枝时间复杂度:O(mn)O(m^n)O(mn),m为工人数,n为任务数class Solution { int ans = Integer.MAX_VALUE; public int

2021-05-08 15:18:43 169

原创 LeetCode 227. 基本计算器 (Java)

0227. 基本计算器 Basic Calculator II(Medium)##Stack##, ##String##在没有括号的情况下,算术表达式情况较为简单乘除优先于加减运算,因此考虑先进行乘除运算,运算结果放回原表达式中,原表达式变为一系列正整数加减后的值遍历整个字符串s,用变量preSign记录每个数字前的操作符,当遍历完一个数字后,根据preSign决定计算计算方法加号:直接将该数加入栈中减号:取该数相反数加入栈中乘除号:取栈顶元素与当前数字进行相应操作后放入栈中初始化时,将

2021-05-05 11:38:19 205

原创 AQS 简单介绍

AQS AbstractQueuedSynchronizerAQS提供了一种框架,以使用FIFO的同步队列实现阻塞锁AQS成员变量 // 同步队列的头。 // 公平的锁先入先出。 private transient volatile Node head; // 等待队列的尾 private transient volatile Node tail; // 同步器的状态,根据当前状态进行判断是否可以获得当前锁 // 如果当前state是0,那么可

2021-04-28 21:57:56 212

原创 Java线程池ThreadPool简单介绍

线程池线程池·好文分享线程池的特点避免创建线程和销毁线程的资源消耗,创建线程需要分配内存,列入调度,线程切换时,还需要内存换页,如果CPU的缓存被清空,还需要重新从内存中读取信息线程池能帮助管理线程线程池能够提高相应速度,直接从线程池请求线程比创建线程的时间开销小,降低处理请求的延迟能够避免无限创建线程引起的OutOfMemoryError线程池的创建线程池的构造函数public ThreadPoolExecutor(int corePoolSize,

2021-04-25 23:30:03 130

原创 ThreadLocal原理简介和内存泄漏

ThreadLocalThis class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its {@code get} or {@code set} method) has its own, independently initialized copy of the variable. {@

2021-04-20 22:18:17 85

原创 Redis数据结构

Redis数据结构Redis底层数据结构Redis底层数据结构一共有6种:简单动态字符串、双向链表、压缩列表、哈希表、跳表、整型数据除了String类型以外,List、Hash、Sorted Set、Set这四种集合类型,底层都有两种实现结构键和值的结构组织Redis使用哈希表保存所有键值对,称为全局哈希表哈希表是一个数组,数组的每一个元素称为哈希桶,哈希桶中元素保存的是指向具体值的指针,如图所示,哈希桶中的entry元素保存了*key指针和*value指针,分别指向了实际的键和值哈希冲突

2021-04-16 16:34:59 134

原创 ReentrantLock 源码介绍

参考B站寒食视频Lock接口ReentrantLock实现了Lock接口,因此先看Lock接口的主要方法/** * Lock提供了区别于synchronized的一种具有更多广泛操作的同步方式, * 它能支持更多灵活的结构并且可以关联多个Condition对象 */public interface Lock { // 获取锁,假如当前锁正在被其他线程占用,将会等待,直到获取为止 void lock(); // 获取锁,假如当前线程在等待过程中被中断,将退出等待,并抛

2021-04-12 18:27:41 96

原创 ConcurrentHashMap相关知识点

ConcurrentHashMap 类注释所有的操作都是线程安全的,我们在使用时,无需再加锁;多个线程同时进行 put、remove 等操作时并不会阻塞,可以同时进行,和 HashTable 不同,HashTable 在操作时,会锁住整个 Map;迭代过程中,即使 Map 结构被修改,也不会抛 ConcurrentModificationException 异常;除了数组 + 链表 + 红黑树的基本结构外,新增了转移节点,是为了保证扩容时的线程安全的节点;提供了很多 Stream 流式方法,

2021-04-11 17:02:49 477

原创 布隆过滤器(Bloom Filter)简单介绍

布隆过滤器(Bloom Filter)布隆过滤器,用很长的二进制矢量和哈希函数实现,主要作用是快速判断一个元素是否在集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。主要特点是如果过滤器判断一个元素不在集合中,那么这个元素必定不在该集合中。命题的否命题则不成立原理初始化长度为n比特的数组,每个比特初始化为0设置k个hash函数,每个hash函数可以将key散列为一个整数(该整数应该小于数组长度)当某个key加入集合时,用k个hash函数计算出k个散

2021-04-11 14:38:41 188

原创 LeetCode 128. 最长连续序列 (Java)

LeetCode 128. 最长连续序列 (Java)##Array##, ##Union Find##并查集O(n)O(n)O(n)哈希表存储每个值-下标作为对应的键值对将连续的值(a = b + 1)通过并查集维护成为联通分量最后找出最大的联通分量,输出其大小class Solution { class UnionFind { int n; int[] p; int[] size; public void init(i

2021-04-10 14:49:26 85

原创 LeetCode130. 被围绕的区域 Surrounded Regions(Java)

LeetCode 130. 被围绕的区域 Surrounded Regions(Java)##DFS##, ##BFS##, ##Union Find##泛洪算法O(n2)O(n^2)O(n2)采用逆向思维,将所有边界上的O采用Flood Fill算法标记其连通域,并做标记#,全图遍历完后,对于board中所有字符不为#的字符,如果为O,即代表不与边界的O(遍历后改为#)相连,因此被X包围,改为X采用int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1}标记即将要

2021-04-10 14:03:39 87

原创 Leetcode72. 编辑距离Edit Distance(Java)

Leetcode72. 编辑距离Edit Distance(Java)动态规划对字符操作的顺序并不能影响结果因此,将字符串操作顺序规定为从左到右操作f(i,j)f(i,j)f(i,j)表示将长度为i的字符串A修改成为长度为j的字符串B的操作所需的最小操作数则只可能分以下6种情况字符串A末尾删除一个字符后与字符串B相同f(i,j)=f(i−1,j)+1f(i,j) = f(i - 1, j) + 1f(i,j)=f(i−1,j)+1表示字符串A的前i-1项与字符串的前j项相同,只需进行一次

2021-03-30 14:34:02 116

原创 Leetcode1262.可被3整除的最大和 Greatest Sum Divisible by Three(Medium)

Leetcode1262.可被3整除的最大和 Greatest Sum Divisible by Three(Medium)0-1背包问题对于每个物品(数),都有放入背包和不放入背包两种选择。f(i,j)=sumf(i,j) = sumf(i,j)=sum表示前iii个数字,通过某种最优选择方式选出某个子集,该子集和为sumsumsum,sumsumsum对333取模为jjj,且sumsumsum是所有子集中,子集和对333取模为jjj的最大和设mod=nums(i)%3mod = nums(i)

2021-03-30 11:33:51 125

原创 Leetcode611. 有效三角形的个数 Valid Triangle Number(Medium)

611. Valid Triangle Number(Medium)##Array##, ##Two Pointers##暴力法O(n3)O(n^3)O(n3)分别枚举三条边,记录可行的方案,该解法会超时优化暴力法O(n3×logn)O(n^3\times logn)O(n3×logn)首先对数组进行排序,每条边都从小到大枚举,枚举第三条边时,遇到第一条边+第二条边≤第三条边第一条边 + 第二条边 \le 第三条边第一条边+第二条边≤第三条边时,不必继续枚举第三条边,因为第三条边继续向右枚举时,仍

2021-03-30 09:21:37 141

原创 FontAwesome图标显示为方框

在做Web项目时,遇到小图标显示为方框的问题通过定位小图标(上图中已经修改好,刚开始时是方框),发现对应html中的某个css文件查的该css文件为fontawesome的文件找到项目的html文件中,css文件引用文件正常引用打开该css文件,我的css文件为all.min.css检查css文件发现我的css文件有url引用,但对应的目录下却没有对应的字体和图标文件从模板网站重新下载对应文件并放入对应的文件路径中重新启动项目,可以正常显示小图标...

2021-03-15 19:36:08 2913

原创 Leetcode 879. Profitable Schemes(Hard)

879. Profitable Schemes(Hard)##Dynamic Programming##本题是01背包问题对于每个工作,都可以选择做或者不做,在这里,每份工作相当于每个物品,都可以取或者不取,而员工数量相当于体积限制,而且还需要满足额外条件最小利益DP1f[i][j][k]表示考虑前i项工作,只有j名员工,要达到利益为k的方案数对于第i项工作,可以选择选或不选选,则f[i][j][k] = f[i - 1][j - group[i]][k -profit[i]],对于之前的i

2021-03-11 11:36:25 93

原创 Leetcode815.公交线路 Bus Routes(Java)

815. Bus Routes(Hard)##BFS##广度优先搜索该题应该为图论题,边有权值的情况下寻找最短路径,采用多源BFS解决假设routes = [[a1, a2, ... an],[b1,b2, ... bn]],其中

2021-03-08 15:35:16 482

转载 LaTeX数学符号

2021-01-18 14:08:16 151

原创 Leetcode236.二叉树的最近公共祖先 Lowest Common Ancestor of a Binary Tree(Java)

Leetcode236.二叉树的最近公共祖先 Lowest Common Ancestor of a Binary Tree(Java)##Tree##二叉树的最近公共祖先后续遍历就是天然的回溯法采用后续遍历所有的结点,主要采用回溯的思想递归函数的作用判断是否能找到结点p或q,但由于还要寻找最近的公共祖先,因此需要返回TreeNode递归出口设定为找到了p或q,或者已经遍历完一条路径时,返回此时遍历的结点root左子树不空时,递归遍历左子树,返回结果为left,右子树不空时,递归遍历右子树,

2020-12-30 14:31:38 73

原创 Leetcode 501.二叉搜索树中的众数 Find Mode in Binary Search Tree(Java)

Leetcode 501.二叉搜索树中的众数 Find Mode in Binary Search Tree(Java)##Tree##二叉搜索树中的众数二叉搜索树的中序遍历为有序序列,因此本题转换为在有序序列中寻找众数max记录已经遍历过的数中,出现的最大频次count记录当前遍历的数出现的频次TreeNode pre记录上一个遍历的结点,如果题目没有Integer.MAX_VALUE,也可以将pre声明为int,并初始化为Integer.MAX_VALUELinkedList<In

2020-12-30 08:55:14 87

原创 Leetcode530.二叉搜索树的最小绝对差 Minimum Absolute Difference in BST(Java)

Leetcode530.二叉搜索树的最小绝对差 Minimum Absolute Difference in BST(Java)##Tree##二叉搜索树的最小绝对差在二叉搜索树的任意结点之间找到最小的绝对差,二叉搜索树的中序遍历是有序序列,相当于在有序序列中找最小绝对差最小绝对差必然出现在有序序列的相邻结点上因此中序遍历枚举遍历相邻两结点的差值,记录最小差值时间复杂度: O(n)class Solution { int min = Integer.MAX_VALUE; int

2020-12-30 08:10:52 117

原创 Leetcode98.验证二叉搜索树 Validate Binary Search Tree(Java)

Leetcode98.验证二叉搜索树 Validate Binary Search Tree(Java)##Tree##, ##Depth-first Search##, ##Recursion##验证二叉搜索树:给定一个二叉搜索树,判断其是否是一个有效的二叉搜索树二叉搜索树的定义(特征)节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节点的数所有左子树和右子树自身必须也是二叉搜索树二叉搜索树中不能存在值相同的结点方法一二叉搜索树的中序遍历是有序序列ArrayList记

2020-12-29 13:02:54 120

原创 Leetcode124.二叉树中的最大路径和 Binary Tree Maximum Path Sum(Java)

Leetcode124.二叉树中的最大路径和 Binary Tree Maximum Path Sum(Java)##Tree##, ##Depth-first Search##, ##Recursion##二叉树中的最大路径和本题采用DFS后序遍历方法递归遍历整棵树,递归时维护每个结点开始向下延伸的最大路径和对于每个结点,都先递归计算完左右子树,将得到的左右子树的向下延伸的最大路径和与该结点值相加,就能够得到经过该结点的最大路径和维护(返回)这个结点向下延伸的最大路径和,从左右子树路径中选择

2020-12-29 09:10:15 69

原创 Leetcode 700.二叉搜索树中的搜索 Search in a Binary Search Tree(Java)

Leetcode 700.二叉搜索树中的搜索 Search in a Binary Search Tree(Java)##Tree##二叉搜索树中的搜索二叉搜索树是一个有序树若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树可以采用递归法和迭代法递归法树的根节点为空时root == null ,返回null树的根节点的值等于目标值root.val == val,返回该根节

2020-12-28 15:04:12 123

原创 Leetcode 654.最大二叉树 Maximum Binary Tree(Java)

Leetcode 654.最大二叉树 Maximum Binary Tree(Java)##Tree##最大二叉树普通递归与普通的构造树方法类似对于一段序列[l,l+1,...r-1,r],找到序列中的最大元素max和其位置pos,则该序列生成树的根节点的值应该为max该序列生成树的根节点的左子树应该在子序列[l,l+1,...pos-1,pos]中生成,因此递归处理该子序列,将根节点的左子树指向递归生成的树节点同理,对于右子树,该序列生成树的根节点的右子树应该在子序列[pos+1,pos+

2020-12-28 15:02:16 130

原创 Leetcode 617.合并两个二叉树 Merge Two Binary Trees(Java)

Leetcode 617.合并两个二叉树 Merge Two Binary Trees(Java)##Tree##合并两个二叉树采用递归做法,前中后序都可以解决,这里采用前序遍历从根节点开始遍历,t1,t2都为空,则返回空t1为空,t2不空,返回t2t1不空,t2为空,返回t1t1,t2均不为空,返回一个值为t1.val + t2.val的结点res,递归两棵树的左右子树,res的左儿子指向递归处理两棵树左子树的结果,res的右儿子指向递归处理两棵树右子树的结果,返回res**时间复杂

2020-12-28 15:00:20 137

原创 Leetcode106. 从中序与后序遍历序列构造二叉树Construct Binary Tree from Inorder and Postorder Traversal(Java)

Leetcode106. 从中序与后序遍历序列构造二叉树Construct Binary Tree from Inorder and Postorder Traversal(Java)##Array##, ##Tree##, ##Depth-first Tree##从中序与后序遍历序列构造二叉树与Leetcode.105 从前序与中序遍历序列构造二叉树类似,采用递归做法,创建根节点,递归创建左右子树,根节点连接左右子树利用后序遍历的性质,前序遍历的最后一个数就是根节点的值在中序遍历中按根节点的值

2020-12-27 14:27:26 95

原创 Leetcode105.从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal(Java)

Leetcode105.从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal(Java)##Array##, ##Tree##, ##Depth-first Search##从前序与中序遍历序列构造二叉树本题采用递归做法,创建根节点,递归创建左右子树,根节点链接两棵子树利用前序遍历的性质,前序遍历的第一个数就是根节点的值在中序遍历中按根节点的值找到根节点的位置temp,则temp左边时左子树的中序遍历

2020-12-27 14:16:13 76

原创 Leetcode113. 路径总和 Path Sum II(Java)

Leetcode113. 路径总和 Path Sum II(Java)##Tree##, ##Depth-first Search##路径总和II参考Leetcode112路径总和,用回溯法因为需要找到所有路径,因此需要DFS整棵子树dfs(TreeNode root, int sum)表示找到所有从root出发,到叶节点和为sum的路径的函数递归遍历左右儿子结点,以左儿子结点为例dfs(root.left, sum - root.val)表示找到所有从root.left出发,到叶子节点和为s

2020-12-26 13:45:39 112

原创 Leetcode112.路径总和 Path Sum(Java)

Leetcode112.路径总和 Path Sum(Java)##Tree##, ##Depth-first Search##路径总和采用DFS解决设置递归函数boolean hasPathSum(TreeNode root, int sum),考虑参数及返回结果,参数为一个树结点,和要求的总和sum,返回表示是否存在一条从这个树结点出发到叶节点的路径和为sum递归遍历时,遍历某个结点node的左儿子结点left时,问题就转变为关于左儿子的子问题hasPathSum(node.left, sum

2020-12-26 11:33:28 109

原创 Leetcode513. 找树左下角的值 Find Bottom Left Tree Value(Java)

Leetcode513. 找树左下角的值 Find Bottom Left Tree Value(Java)##Tree##, ##Depth-first Search##, ##Breadth-first Search##找树左下角的值,即找最底下一层的最左边结点本题深度优先搜索、广度优先搜索都可以解决BFS使用队列,每次循环每一层,记录每一层的最左边结点,最后返回的即为最底下一层的最左边结点DFS函数需要维护当前深度depth和已经遍历过的最大深度count,当前深度depth大于已遍历过的最

2020-12-26 10:39:29 129

空空如也

空空如也

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

TA关注的人

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