自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

reachwang的博客

一个java小白,自学中

原创 leetcod_215:数组中的第K个最大元素

这个题目是典型的用堆来解决的。关于堆无非就是有两个算法: 在尾部插入元素的时候,需要自底向上的去寻找插入位置 在顶部插入元素的时候,需要自顶向下的去寻找插入位置 代码如下: class Solution { public int findKthLargest(int[] nums, i...

2020-01-11 20:37:04

阅读数 131

评论数 0

原创 leetcode_46:全排列

全排列,出了名的回溯法解决。不多说了,直接上代码吧: class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> ...

2019-12-19 20:59:31

阅读数 138

评论数 0

原创 leetcode_33:搜索旋转排序数组

这个题目的话关键在于找出旋转后数字的排列规律来。其实一个排好序的数组经过某一个点的旋转后,有一个特点就是在某个点为界限,左边是升序,右边是降序。我们其实利用一个折线图更容易理解些,如下这个点为7,其实就是最大值。 那么我们既然时间复杂度是 O(log n) ,那肯定是二分法查找,只是这个求出mi...

2019-12-19 20:40:12

阅读数 140

评论数 0

原创 redis---压缩列表

压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么redis就会使用压缩列表来做列表键的底层实现。 另外,当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么red...

2019-12-17 22:21:35

阅读数 140

评论数 0

原创 leetcode_131:分割回文串

遇到这个题目,我真的是头大。还是硬着头皮往下看,嗯,典型的回溯法。就写吧,回溯法我也讲不明白说实话,只是做了几道题然后慢慢找到了规律就会了。先上代码(代码花费的时间好多啊!!): public List<List<String>> partition(String ...

2019-12-17 21:39:16

阅读数 150

评论数 0

原创 leetcode_179:最大数

这个题目我是想到了使用自定义排序,而且要注意的是,我们是比较数字的字符串形式,因为这样容易直接从数字的高位开始比较。我们仔细想能找出构造最大数的规律: 如果两个数字的位数相同,我们只需要那个最大的在前面,较小的再后面就可以了。 如果两个数字位数不同,那么就要从头开始比较,哪个高位大,哪个就在前面...

2019-12-17 20:42:36

阅读数 147

评论数 0

原创 leetcode_162:寻找峰值

这个题目主要是弄懂峰值出现的时候会有哪些情况。

2019-12-17 19:39:42

阅读数 143

评论数 0

原创 leetcode_739:每日温度

1. 暴力破解法 这个题目本身来说直接暴力根本不难,只是暴力的话时间复杂度相对较高。暴力也就是遍历每一个元素,然后从目标元素触发向后找,找到第一个比他大的数字位置,然后用此位置减去目标元素所在的位置就是两者的间隔。代码如下: public int[] dailyTemperatures(i...

2019-12-14 22:34:17

阅读数 136

评论数 0

原创 leetcode_230:二叉搜索树中第K小的元素

这个题目我知道可以使用前序的非递归遍历,然后遍历的过程中改变k,直到找到为止。中序的遍历的非递归实现其实不难,我们只要缕清中序遍历的过程就很好写,前序遍历也就是左—>根—>右的顺序,那么我们可以先将根节点和其左子树进栈,然后在出栈的时候看看它的右子树是不是空,不为空则把右子树作为根节点...

2019-12-13 19:13:55

阅读数 138

评论数 0

原创 leetcode_73:矩阵置零

这个题目不难,看题目最后的说明,说可以用O(mn)空间来解决,也可以用O(m+n)空间来解决。说白了这个问题就是记录每行或每列是否有0的问题,有零则设置一个标志。那么O(mn)的不用说了,就是每个位置都记录,然后用记录的标志去更新原数组。接下来说一下O(m+n)的情况: O(m+n)则是以行或者列...

2019-12-12 22:02:56

阅读数 137

评论数 0

原创 leetcode_78:子集

这个题好意外啊,一顿分析猛如虎,一看战绩零杠五。其实我的思路是对的,只是在递归的时候没有想好参数,接下来说一下解题思路。 首先看到这个题目的话,应该能想到就是使用回溯法,也就是使用递归。在我们想到要用回溯法的时候,一般递归的参数里面都会有一个层数来告诉我们什么时候返回。这里也不例外,我们这里的层数...

2019-12-12 21:28:15

阅读数 137

评论数 0

转载 HTTP协议篇(一):多路复用、数据流

1.管道机制、多路复用 1.1 管道机制(Pipelining) HTTP 1.1 引入了管道机制(Pipelining),即客户端可通过同一个TCP连接同时发送多个请求。如果客户端需要请求两个资源,以前的做法是在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求;而管...

2019-12-09 17:20:06

阅读数 142

评论数 0

原创 leetcode_61:旋转链表

这个题目也不难,只要分析出来旋转的规律就比较简单了。我看到的规律有两点: 旋转了k次,其实就是对链表旋转了k % 链表长度次。 旋转其实就是求倒数第k个节点,然后让这个节点及后面的节点接到头部。 有了这两点,代码上可能就是要保存的变量比较多,还是要尝试写一下,但思路不难: public...

2019-12-07 17:52:11

阅读数 141

评论数 0

原创 leetcode_30:串联所有单词的子串

先看一下我的战况,看看那三个七分钟…,没办法着急了受,其实大部分时间就是花在了调边界条件上了。 然后说一下思路吧:其实就是使用空间换取时间,但是我的时间没有很低,反而空间比我想象的要低一些。步骤如下: 我们把words中的所有单词放到哈希表中,其中的键为每个单词,值为单词的次数。 然后我们遍历...

2019-12-07 17:19:17

阅读数 137

评论数 0

原创 内存分配与回收策略

其实Java技术体系中的自动内存管理本质上就是自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。内存的回收我们已经讲过,现在看看内存的分配。 内存分配是在堆里面进行的,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接...

2019-12-06 22:13:17

阅读数 136

评论数 0

原创 HotSpot的算法实现

我们知道虚拟机中的对象存活判定算法和垃圾收集算法,但在HotSpot中实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。 1. 枚举根节点 从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要正在**①全局性的引用(常量或类静态属性)与...

2019-12-06 16:22:34

阅读数 137

评论数 0

原创 leetcode_19:删除链表的倒数第N个节点

这个题目其实比较简单,我们都知道怎么做。无非就是先让一个指针tail指向开头pre(初始为head)的后面的第n个位置,然后pre和tail同时向后移动,tail为空的时候,pre指向的就是要删除的节点。但是我却错了很多次,当然原因就是因为边界条件,即如果只有一个节点怎么办?如果删除的是第一个节点...

2019-12-05 11:41:23

阅读数 136

评论数 0

原创 leetcode_117:填充每个节点的下一个右侧节点指针 II

这个题目和leetcode_116是类似的,但是这个题目不能其中的第二种解法,因为它并不是一个完全二叉树。但是第一种解法是可行的(原谅我第一种写法写的有点冗余,但是也不想改了,算是留着个教训吧)。 查看当前节点是父节点的左子节点还是右子节点。 如果是左子节点则查看右子节点是否为空:不为空则让左子...

2019-12-04 20:35:15

阅读数 138

评论数 0

原创 leetcode_72:颜色分类

这个题目一开始并不会做,但是后来硬着头皮还是做了出来(傲娇脸!!)。咋个说呢,思路比较容易想到,就是把0放左边,2放右边,那么中间自然就是1了。我也是这样想的,我也是这样做的,哈哈。下面说一下大体思路。 首先有两个指针p0和p2,它们分别从最左端和最右端出发,而且分别始终指向第一个不为0和不为2...

2019-12-02 21:32:55

阅读数 141

评论数 0

转载 leetcode_201:数字范围按位与

显然,暴力解决方法是从m开始直到n求按位与,但很明显这太慢了,虽然时间复杂度是O(n),但显然不是一个好的解法.我们可以注意到这样一点,在数字加1的时候,最低位肯定会从0变成1,或者从1变成0,不管哪样,两个数的最低位中势必有一个0,而一旦出现了一个0,这一位上的按位与结果将永远为0.假如在m-&...

2019-12-02 17:42:19

阅读数 138

评论数 0

原创 leetcode_31:下一个排列

这个题目更像是一个数学题目,是需要分析的。我们知道如果从数字的末尾向前遍历,一直是递增的状态,那么这个数字本身就已经是最大数字了。如下图所示,包括a[i]及后面的数字组合就是最大的,但是遇到了a[i-1],就不是了,所以要从这个a[i-1]下手。 包括a[i-1]及后面的数字组合不是最大的,那么比...

2019-12-01 22:53:58

阅读数 139

评论数 0

原创 leetcode_64:最小路径和

这个题目就是典型的动态规划问题,因为每次只能向右或者向下走,所以对于一个矩阵,第一行和第一列的dp值就是前面的值相加得到的和。然后对于剩下的所有节点,其dp值应该是本节点的值和上边节点和左边节点中较小的dp值的和。公式为: for i=1 to rows dp[0][i] = grid[0][i...

2019-12-01 21:40:31

阅读数 139

评论数 0

原创 leetcode_238:除自身以外数组的乘积

这个题目就是《剑指offer》上面的面试题66。刚开始就是按照上面的思路然后构造了两个数组pre和last,分别记录从前往后的累乘积和从后往前的累乘积,然后再遍历一次得到result,其中result[i] = pre[i-1] * last[i+1]。代码如下: public stati...

2019-12-01 17:36:28

阅读数 138

评论数 0

原创 leetcode_1171:从链表中删去总和值为零的连续节点

这个题目的思路基本上和3Sum是类似的。使用三个指针,一个指针p1指向要计算的指定区间子链表的前一个节点,方便删除节点,即它自己不会参与计算;另外两个指针p2和p3则用于计算一个区间内的综合,如果某个区间内总和为0,那么此时p3所指的正好是区间外的第一个节点,此时将p1.next=p3即可。代码如...

2019-12-01 15:06:55

阅读数 160

评论数 0

原创 leetcode_1019:链表中的下一个更大节点

这个题目我第一次看到太简单了吧,暴力就完事了,果不其然,时间复杂度很高,当然也是过了,没什么难度: public int[] nextLargerNodes(ListNode head) { List<Integer> result = new LinkedLi...

2019-12-01 14:05:15

阅读数 150

评论数 0

转载 Java中List和数组Array相互转换

Java中List转换为数组,数组转List List转换为Array可以这样处理: ArrayList<String> list=new ArrayList<String>(); String[] strings = new String[list.size()]; ...

2019-11-30 22:19:23

阅读数 140

评论数 0

原创 leetcode_559:N叉树的最大深度

这个题目第一次看到当然很简单,求这种层数最基本的思路就是广度优先遍历了,思路简单,代码也不难。只是在设计队列的时候要注意里面要存放的是怎样的数据: public int maxDepth(Node root) { if (root == null) ...

2019-11-30 22:09:22

阅读数 137

评论数 0

原创 早期(编译期)优化

Java语言的“编译期”其实是一段“不确定”的操作过程,它可能包含三类: 前端编译器:把*.java文件转变为*.class文件的过程,如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)。 后端运行期编译器(JIT):把字节码转变为机器码,如HotSpot VM的C1、C2编...

2019-11-30 21:22:25

阅读数 140

评论数 0

原创 leetcode_199:Binary Tree Right Side View

这个题目其实没啥说的,就是层次遍历,每次都取那一层的最后一个就行。只是编码过程中有一些边界条件需要注意,再有就是这种需要保存上一层状态的题目,一般是需要两个队列的,来轮流保存每层的节点,代码如下: public List<Integer> rightSideView(TreeN...

2019-11-29 22:45:28

阅读数 137

评论数 0

原创 leetcode_127:单词接龙

hgfg

2019-11-29 20:17:30

阅读数 153

评论数 0

原创 redis--整数集合

整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,redis就会使用整数集合作为集合键的底层实现。 1. 整数集合的实现 整数集合是redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证...

2019-11-27 19:40:35

阅读数 137

评论数 0

原创 redis---字典

字典是一种用于保存键值对的抽象数据结构,在字典中一个键(key)可以和一个值(value)进行关联,这些关联的键和值就称为键值对,字典中的每个键都是独一无二的。 1. 字典的实现 redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对...

2019-11-26 21:12:41

阅读数 138

评论数 0

原创 leetcod_39:组合总和

这个题目就是很典型的回溯法,说实话,我讲不明白回溯法是个咋回事,但是会写一点(气人不)。这个题目是我写完电话号码组合后紧接着做得题目,可能是手感来了。总之核心思想就是要画一个树,然后在某个时刻要学会剪枝(不符合条件时直接返回)。代码如下: public static List<Lis...

2019-11-23 22:11:42

阅读数 139

评论数 0

原创 redis---链表

redis中每个链表节点使用一个adlist.h/listNode结构来表示: typedef struct listNode { //前置节点 struct listNode *prev; //后置节点 //struct listNode *next; //节点的值 void *va...

2019-11-23 20:07:18

阅读数 137

评论数 0

原创 redis---简单动态字符串

Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(SDS)的抽象类型,并将其作为Redis的默认字符串表示,即Redis中包含字符串值的键值对在底层都是由SDS实现的。 ...

2019-11-23 19:31:42

阅读数 136

评论数 0

原创 CountDownLatch原理解剖

先看一下这个类是怎么用的,因为我们知道,可能要执行一个任务的时候需要等待其他任务执行完毕才可进行。比如当前某个线程需要“断一栋大楼的电”,它需要所有其他要用电的线程(工作人员)执行完任务后才能“断电”。这个过程有时候会用到Thread.join()方法,让当前线程阻塞,直到其他线程执行完毕为止。但...

2019-11-21 20:36:58

阅读数 140

评论数 0

原创 leetcode_101:对称二叉树

首先看到这个题,肯定想到是用递归来解决的。但是怎么递归是个问题,对称二叉树的定义就是一个节点的值和对称节点的值相等,且它的左子树节点和对称节点的右子树节点也满足类似关系,它的右子树节点和对称节点的左子树节点也满足类似关系。同样左右子树也要满足这样的条件。于是有了如下代码: class Soluti...

2019-11-16 17:30:36

阅读数 140

评论数 0

原创 JVM中的栈帧结构

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应一个栈帧在虚拟机栈里面从入栈到出栈的过程。在编译程序代码的时候...

2019-11-15 23:03:56

阅读数 164

评论数 0

原创 Java虚拟机中的方法调用过程

方法调用不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)。但是Class文件的编译过程不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局的入口地址(相当于直接引用)。这个特性给Java带来了更强大的动...

2019-11-15 14:41:55

阅读数 141

评论数 0

原创 redis---数据库

redis服务器会将所有的数据库保存在redisServer结构的db数组中,每一个redisDb结构代表一个数据库。如下: struct redisServer { ... redisDb *db; //一个数组,保存服务器中所有的数据库 ... int dbnum; //服务器中的数...

2019-11-14 09:06:18

阅读数 137

评论数 0

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