自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode096. 不同的二叉搜索树

LeetCode096. 不同的二叉搜索树给定一个整数n,求以1 ...n为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 ...

2020-12-01 11:09:51 164 1

原创 Java并发编程系列 - 互斥锁:解决原子性问题

Java并发编程系列 - 互斥锁:解决原子性问题原子的意思代表着“不可分”,那么如果我们要保证原子性就必须满足“同一时刻只有一个线程执行”,称之为互斥。如果我们能够保证对 共享变量的修改是互斥的,那么,无论是单核 CPU 还是多核 CPU,就都能保证原子性了。如上图所示,线程A和B同时访问共享资源,只有获取到锁的线程才能得到访问同步资源的权限并且同一时刻只有一个线程访问,其他线程等待,当重新获取到锁时才能访问同步资源。Java 语言提供的锁技术:synchronizedsynchroni

2020-11-28 15:39:16 198

原创 Java并发编程系列 - Java内存模型

Java并发编程 - Java内存模型可见性、原子性和有序性

2020-11-19 15:55:00 224

原创 LeetCode98. 验证二叉搜索树

LeetCode98. 验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例1:输入: 2 / \ 1 3输出: true示例2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,nu...

2020-11-18 14:40:42 96

原创 LeetCode94. 二叉树的中序遍历

LeetCode94. 二叉树的中序遍历给定一个二叉树的根节点root,返回它的中序遍历。示例 1:输入:root = [1,null,2,3]输出:[1,3,2]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]提示:树中节点数目在范围[0, 100]内-100 <= Node.val <= 100树的中序遍历,递归:1. 若根节点为空,直接返回 2. 若...

2020-11-17 15:15:17 156

原创 Redis系列 - 缓存雪崩、击穿、穿透及解决方案

Redis系列 - 缓存雪崩、击穿、穿透及解决方案缓存雪崩、缓存击穿和缓存穿透一旦发生,会导致大量的请求积压到数据库层。如果请求的并发量很大,就会导致数据库宕机或是故障,这就是很严重的生产事故了。缓存雪崩缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。缓存雪崩一般是由两个原因导致的缓存大面积失效 Redis 缓存实例发生故障宕机了,无法处理请求,这就会导致大量请求一下子打到数据库层解决方案缓存数据的过期时间设置随机值(例如,随机增加1~5分钟

2020-11-16 19:32:25 164

原创 LeetCode92. 反转链表 II

LeetCode92. 反转链表 II反转从位置m到n的链表。请使用一趟扫描完成反转。说明:1 ≤m≤n≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL迭代,反转法因为要反转中间的链表,所以我把链表分成三部分(前部分链表,反转链表和后部分链表)找到前部分链表的尾节点(第m-1个节点)就可以开始反转,最后把三个...

2020-11-16 10:57:56 135

原创 LeetCode328. 奇偶链表

LeetCode328. 奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2->4->NULL示例 2:输入: 2-&g

2020-11-13 10:53:32 76

原创 LeetCode90.子集II

LeetCode90.子集II给定一个可能包含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[ [2], [1], [1,2,2], [2,2], [1,2], []]回溯法,不熟悉回溯法的可以看看这边文章,回溯思想团灭排列、组合、子集问题:https://leetcode-cn.com/problems/subsets/solution/hui-su-si-xiang-.

2020-11-12 17:41:53 94

原创 LeetCode922. 按奇偶排序数组 II

LeetCode922. 按奇偶排序数组 II给定一个非负整数数组A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当A[i] 为奇数时,i也是奇数;当A[i]为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。示例:输入:[4,2,5,7]输出:[4,5,2,7]解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。提示:2 <= A.length <= 20000A.length % ...

2020-11-12 16:58:48 780 2

原创 Redis系列 - 一文搞懂缓存淘汰策略

Redis - 缓存淘汰策略在使用Redis时,我们一般会为Redis的缓存空间设置一个大小,不会让数据无限制的放入Redis缓存。对于 Redis 来说,一旦确定了缓存最大容量,比如 4GB,你就可以使用下面这个命令来设定缓存的大小了:CONFIG SET maxmemory 4gbRedis设置了缓存的容量大小,那么缓存被写满是不可避免的。我们需要面对缓存写满时的替换操作。缓存替换需要解决两个问题:决定淘汰哪些数据,如何处理那些被淘汰的数据。Redis有哪些淘汰策略noe

2020-11-12 09:44:07 259

原创 LeetCode89. 格雷编码

LeetCode89. 格雷编码格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。格雷编码序列必须以 0 开头。示例 1:输入:2输出:[0,1,3,2]解释:00 - 001 - 111 - 310 - 2对于给定的n,其格雷编码序列并不唯一。例如,[0,2,3,1]也是一个有效的格雷编码序列。00 - 010 - 211 ...

2020-11-11 11:50:57 152

原创 Redis系列 - 如何应对Redis变慢

Redis系列 - Redis如何避免单线程模型阻塞

2020-11-10 15:01:46 515 1

原创 LeetCode88.合并两个有序数组

LeetCode88.合并两个有序数组给你两个有序整数数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。说明:初始化nums1 和 nums2 的元素数量分别为m 和 n 。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3输出:[1,2,...

2020-11-10 10:30:18 134

原创 LeetCode31.下一个排列

LeetCode31.下一个排列实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1我们希望下一个数比当前数大,这样才满足“下一个排列”的定义。因此只需要将后面的「大数」与前面的「小数」交换,就能得到一个更大的数

2020-11-10 10:01:25 85

原创 PriorityQueue的使用和底层实现原理

PriorityQueue的使用和底层实现原理优先队列的作用是能保证每次取出的元素都是队列中权值最小(最大)的。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器。Java中PriorityQueue通过二叉堆实现,可以用一棵完全二叉树表示(任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue的底层实现,PriorityQueue通过一个Object数组来存储数据。

2020-11-09 19:26:57 384

原创 LeetCode86. 分隔链表

LeetCode86. 分隔链表给定一个链表和一个特定值x,对链表进行分隔,使得所有小于x的节点都在大于或等于x的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5双指针法:设置两个链表,在第一个链表中存放小于x的值,第二个链表中存放大于等于x链表的值,然后将第二个接在第一个链表尾部,最后返回这...

2020-11-09 17:06:16 105

原创 LeetCode973. 最接近原点的 K 个点

LeetCode973. 最接近原点的 K 个点我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。示例 1:输入:points = [[1,3],[-2,2]], K = 1输出:[[-2,2]]解释: (1, 3) 和原点之间的距离为 sqrt(10),(-2, 2) 和原点之间的距离为 sqrt(8),由于 s

2020-11-09 16:05:46 158

原创 SpringBoot启动流程

SpringBoot启动流程SpringBoot的启动类入口SpringBoot与Spring相比最直观的区别就是SpringBoot有自己独立的启动类。@SpringBootApplicationpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }}从上面代码可以看出,Annotation定义(@Spri

2020-11-08 22:52:42 278

原创 SpringBoot不同环境加载不同配置文件

Spring不同环境加载不同配置文件 - resource & profile我们在使用spring的时候,一般都会有不同的环境需要部署:开发环境、测试环境和生产环境,而不同的环境则会有不同的配置,比如数据库ip。解决这个问题,我所熟悉的有两种策略:springboot的profile参数配置 pom文件的resource & profile配置springboot的profile配置Spring Profiles 允许用户根据环境配置来读取不同的配置文件(dev,test,

2020-11-06 19:35:28 4723 2

原创 Redis系列 - Redis基本数据类型

Redis系列 - Redis基本数据类型与操作字符串String 散列Hash(key-filed-value) 列表List SortedSet(zSet) Set字符串String字符串是Redis中最常用的类型,是一个由字节组成的序列,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据。Value最多可以容纳的数据长度为512MB。set (set key value) get (get key) setnx(setnx key value) 如..

2020-11-05 10:24:04 315

原创 Redis系列 - Redis底层数据结构(简单动态字符串(SDS)、链表、字典、跳跃表、整数集合、压缩列表)

Redis系列 - Redis基本数据类型

2020-11-04 16:22:56 1091 1

原创 Redis系列 - 主从库模式、哨兵和分片集群

Redis系列 - 主从库模式、哨兵和分片集群主从库模式Redis的高可靠性主要包括两方面:数据尽量少丢失:RDB & AOF机制 服务尽量少中断:增加副本冗余主从模式Redis提供了主从库模式,增加冗余的副本来提高Redis集群的高可靠性。主从库之间采用读写分离的方式,写请求只能在主库,读请求在主从库都可以完成。读操作:主库、从库 写操作:主库 --> 主库写完后同步从库写请求为什么只能在主库上,若从库和主库上都可以进行读写会发生什么?1. 若有3个写请求

2020-10-29 01:35:30 679 2

原创 Redis系列 - Redis缓存更新:先更新数据库还是先更新缓存?

Redis系列 - Redis先更新数据库还是先更新缓存?先更新数据库再失效缓存

2020-10-28 17:05:37 1836 2

原创 Redis系列 - Redis数据持久化(AOF&RDB)?

Redis系列 - Redis数据持久化(AOF&RDB)?宕机了,Redis如何避免数据丢失?AOF RDBAOFRedis先将数据写入Redis内存,再记日志,Redis使用的写后日志。为了避免额外的检查开销,Redis 在向 AOF 里面记录日志的时候,并不会先去对这些命令进行语法检查。所以,如果先记日志再执行命令的话,日志中就有可能记录了错误的命令,Redis 在使用日志恢复数据时,就可能会出错。AOF日志记录格式:以 Redis 收到“set key1valu.

2020-10-25 13:50:34 964 1

原创 Redis系列 - 单线程的Redis为什么那么快?

Redis系列 - 单线程的Redis为什么那么快?Redis为什么使用单线程?在说这个问题之前我们先来了解下引入多线程常见的开销:1. 上下文切换:即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程时同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保

2020-10-25 13:00:57 2355 6

原创 ArrayList、ArrayDeque与LinkedList区别

ArrayList、ArrayDeque与LinkedList区别

2020-10-16 20:45:09 7482 2

原创 LeetCode80:删除排序数组中的重复项II

LeetCode80:删除排序数组中的重复项II给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例1:给定 nums = [1,1,1,2,2,3],函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。你不需要考虑数组中超出新长度后面的元素。示例2:给定 nums = [0,..

2020-10-16 00:27:10 700

原创 LeetCode69:x的平方根

LeetCode69:x的平方根

2020-10-15 20:14:42 673

原创 LeetCode70. 爬楼梯

爬楼梯

2020-10-12 00:06:20 657

原创 LeetCode67. 二进制求和

二进制求和

2020-10-11 23:54:02 652

原创 ES入门与核心原理(七)Elasticsearch路由、写入与查询原理

ES路由、写入、近实时刷盘与查询原理

2020-10-11 23:46:10 1728 1

原创 ES入门与核心原理(六)Elasticsearch并发冲突解决:乐观锁vs悲观锁

ES入门与核心原理(六)Elasticsearch并发冲突:乐观锁vs悲观锁

2020-10-11 09:41:41 1036

原创 ES入门与核心原理(五)Elasticsearch分布式:数据分片、节点扩展与容错

ES入门(五)Elasticsearch分布式架构

2020-10-11 00:59:48 1147

原创 Leetcode64:最小路径和

Leetcode64:最小路径和给定一个包含非负整数的mxn网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。动态规划这题求的是从左上角到右下角,路径上的数字和最小,并且每次只能向下或向右移动。所以上面很容易想到动态规划求解。我们可以使用一个二维数组dp,dp[i][j]表示...

2020-10-10 10:09:29 700

原创 Leetcode62:不同路径

Leetcode62:不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 -> .

2020-10-09 11:36:22 756

原创 Leetcode61:旋转链表

Leetcode61:旋转链表给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。示例1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL示例2:输入:...

2020-10-09 11:06:52 1432 2

原创 ES入门(四)Elasticsearch之单字符串多字段查询

ES入门(四)Elasticsearch之单字符串多字段查询Dis Max Query数据准备,索引my_index002{ "name" : "C++", "dec" : "i like writing artcle"},{ "name" : "java", "dec" : "i like writing solution artcle"},{ "name" : "solution", "dec" : "i think java is nice"},{

2020-10-08 23:29:44 1429 1

原创 ES入门(三)Elasticsearch之Mapping(Dynamic Mapping与显示Mapping)

ES入门(三)Elasticsearch之Mapping(Dynamic Mapping与显示Mapping)什么是mapping?mapping类似数据库中的schema的定义,作用如下 定义索引中的字段名称 定义字段的数据类型,例如字符串、数字、布尔。。。 字段,倒排索引的相关配置 mapping会把JSON文档映射成Lucene所需要的扁平文档 一个mapping属于一个索引的type 每个文档都属于一个type 一个type有...

2020-10-07 23:46:06 1092

原创 ES入门(二)Elasticsearch之Query DSL:ES增删查改、聚合分析

ES(二)Query DSLelasticsearch的CRUDelasticsearch是面向文档的搜索分析引擎。应用系统的数据结构都是面向对象的,复杂的 对象数据存储到数据库库,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原对象格式,相当麻烦 ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引、全文检索、分析聚合等功能 es的document用json数据格式来表达下面对es的query dsl(1)快速检.

2020-10-05 13:41:25 1340

空空如也

空空如也

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

TA关注的人

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