Java
文章平均质量分 61
笑忘哭
路痴的救赎
展开
-
【思路分析】Leetcode 111 题 二叉树的最小深度(标签:树、深度优先搜索)
题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 :输入:root = [3,9,20,null,null,15,7]输出:2思路分析① 保存一个全局遍历 min 作为最小深度。② 搜索叶子节点,将该节点的深度 level 与 min 比较,取较小者。代码描述使用 Java 进行代码描述:class Solution { i原创 2021-02-13 14:03:20 · 671 阅读 · 5 评论 -
Leetcode 107 题 二叉树的层序遍历 II(标签:树、深度优先搜索)
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7],原创 2021-02-13 13:47:35 · 210 阅读 · 2 评论 -
Leetcode 101 题 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。原创 2021-02-10 23:11:35 · 191 阅读 · 0 评论 -
Leetcode 191 题 位 1 的个数
题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。思路分析方法一、计算每一位是否为 1显然,我们可以通过判断数中每一位是否为 1 求得位 1 的个数。① 获得最低位是否为 1,通过 n & 1,若结果为 1 ,说明最低位为 1,否则最低位为 0。② 通过位移更新最低位, n >>= 1,移位 32 次后,n 中的每一位都会被获得。publi原创 2021-02-09 12:17:59 · 155 阅读 · 0 评论 -
Leetcode 206 题 反转链表
文章目录题目描述思路分析技术公众号:小猿君的算法笔记题目描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路分析「原地逆置」利用三指针 pre、cur 和 next 三个连续的指针,分别指向前一个节点、当前节点以及当前节点的下一个节点。在原地进行逆置,cur.next = pre,那么 cur 就会和后面的节点开连接,为了避免这一问题,需要使用 next 指原创 2021-02-05 22:44:52 · 185 阅读 · 0 评论 -
Leetcode 207 题 课程表
题目描述你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例1:输入:2, [[1,0]]输出:true解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入:2, [[1,0],[0,1]]输出:false解释:总共原创 2021-02-05 22:34:44 · 300 阅读 · 0 评论 -
Leetcode 100 题 相同的树
文章目录题目描述思路分析代码描述技术公众号:小猿君的算法笔记题目描述给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例:输入:输出:true思路分析通过递归对二叉树各个节点进行比较,以判断两棵树是否相同。判断递归的返回条件:1、如果两个节点都为空,说明比较到了尽头,返回 true。2、如果一个节点为空,另一个节点不为空,两节点不同,返回 false。3、如果左右子树都相同,返回 true,否则返回 false。原创 2021-01-31 15:49:41 · 245 阅读 · 0 评论 -
Leetcode 213 题 打家劫舍 II
题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。示例:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相原创 2021-01-30 18:37:55 · 169 阅读 · 0 评论 -
Leetcode 190 题 颠倒二进制位
题目描述颠倒给定的 32 位无符号整数的二进制位。示例:输入:00000010100101000001111010011100输出:00111001011110000010100101000000解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。思路分析1、对二进制数进行翻转,类似于整数翻转,需要先获得二进原创 2021-01-27 23:43:56 · 170 阅读 · 0 评论 -
Leetcode 199 题 二叉树的右视图
题目描述给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入:[1,2,3,null,5,null,4]输出:[1, 3, 4]解释:思路分析显然,我们需要获得每层最右边的元素,加入到结果集中。「广度优先搜索」层序遍历,按照从右到左的顺序访问节点,每层第一次被访问的元素即为最右边元素。class Solution { public List<Integer> rightSideView(TreeNode root)原创 2021-01-27 23:37:13 · 153 阅读 · 0 评论 -
Leetcode 203 题 移除链表元素(标签:链表)
题目描述删除链表中等于给定值 val 的所有节点。示例:输入:1->2->6->3->4->5->6, val = 6输出:1->2->3->4->5思路分析「使用双指针」为了方便处理,可以利用哑节点记录表头节点。使用双指针 pre 和 cur 分别指向上一个节点和当前节点。如果当前节点为需要被删除的目标节点,那么上一个节点的指针就要指向当前节点的下一个节点。class Solution { public ListN原创 2021-01-23 15:34:32 · 231 阅读 · 0 评论 -
Leetcode 134 题 加油站(标签:贪心算法)
题目描述在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例:输入:gas = [1,2,3,4,5]cost = [3,4,5,1,2]输原创 2021-01-19 22:02:57 · 336 阅读 · 0 评论 -
Leetcode 540 题 有序数组中的单一元素
题目描述给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例:输入: [1,1,2,3,3,4,4,8,8]输出: 2注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。思路分析「思路一」由于每个元素都会出现两次,寻找只出现一次的元素,我们可以想到的是使用异或,我们可以利用异或的特性,相同为0,那么出现两次的结果都会被异或为0,剩下的那一位就是我们需要的结果。「思路二」到目前为止,题目所给的有序数组这一条件我们似乎并没原创 2021-01-14 23:31:50 · 448 阅读 · 0 评论 -
Leetcode 354 题 俄罗斯套娃信封问题
题目描述给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。原创 2021-01-11 22:33:29 · 532 阅读 · 0 评论 -
Leetcode 300 题 最长递增子序列
题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。思路分析这道题求最长上升子序列,我们可以定义一个 dp 数组,dp[i] 表示以 nums[i] 为最后一个元素时,最长上原创 2021-01-09 18:52:03 · 5214 阅读 · 1 评论 -
Leetcode 417 题 太平洋大西洋水流问题
题目描述给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。示例:给定下面的 5x5 矩阵:返回:[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元)。思路分析原创 2021-01-02 14:38:26 · 565 阅读 · 0 评论 -
MongoDB之Spring Data MongoDB
这里创建springboot工程,使用spring data mongodb,首先需要创建工程,引入坐标。<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.1.8.RELEASE</version></dependency&原创 2020-06-26 19:43:20 · 9113 阅读 · 0 评论 -
Java并发编程之AQS原理
AQS框架基本特性与结构Java并发包当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronize简称AQS。AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。AQS核心AQS核心有三点:自旋:控制线程不跳出逻辑LockSupport类中有park(线程阻塞)、unpark...原创 2019-12-03 16:24:26 · 288 阅读 · 0 评论 -
Java基础之内省机制
内省机制Java中提供了一套API用来访问某个属性的getter/setter方法,这些API存放与包java.beans中,一般的做法是通过类Introspector的getBeanInfo方法来获取摸个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后...原创 2019-12-03 15:09:43 · 237 阅读 · 0 评论 -
Java8新特性之方法引用
方法引用前面讲过Lambda表达式,而方法引用是Lambda表达式的一种特殊情况,或者说,是Lambda表达式的一种语法糖。方法引用的分类方法引用可以分为4类:1、类名::静态方法名2、引用名(对象名)::实例方法名3、类名::实例方法名4、构造方法引用:类名::new类名::静态方法名测试自定义学生类public class Student{ private...原创 2019-07-08 12:50:11 · 317 阅读 · 0 评论 -
Java8新特性之Lambda表达式
为什么需要Lambda表达式在Java中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数方法。Lambda表达式为Java添加了缺失的函数式编程的特性,使我们能将函数当做一等公民看待,在Java中,Lambda表达式是对象,他们必须依附于一类特别的对象类型——函数式接口。下面是一个普通的Swing程序使用匿名内部类与Lambda的写法 JFrame jFrame=new J...原创 2019-07-05 10:47:21 · 718 阅读 · 0 评论 -
Java基础之自动装箱和拆箱
自动装箱和拆箱就是将基本数据类型和包装类之间进行的自动转换。JDK1.5 后,Java引入了自动装箱(autoboxing)、拆箱(unboxing)自动装箱基本类型的数据处于需要对象的环境中时,会自动转为”对象“以Integer为例,在JDK1.5以前,这样的代码 Integer i=5 是错误的,必须要通过Integer i=new Integer(5) 这样的语句来实...原创 2019-05-24 16:49:48 · 165 阅读 · 0 评论 -
Java并发编程之CAS算法
CAS介绍CAS(Compare And Swap)比较并交换,CAS算法的过程是这样的:它包含了3个参数CAS(V,E,N)。V 表示要更新的变量E 表示旧的预期值N 表示新值。当V的值等于E 的值的时候,表示当前变量V 没有被其他线程更新,那么将V 的值设置为N当V的值不等于E 值的时候,表示当前变量V 被其他线程更新,那么就不会对V 进行更新。CAS例子假设有两个线...原创 2019-04-16 14:31:38 · 255 阅读 · 0 评论 -
Java8新特性之java.util.function包下的函数式接口
Function接口Function接口,是函数式接口,在用户实际使用的时候可以传递任意的操作给该函数,它可以用来传递行为。对于 Function<T,R>的参数,其表示传入T类型的对象,返回R类型的对象。public class FunctionTest{ public int compute(int a, Function<Integer,Intege...原创 2019-07-07 17:41:20 · 1394 阅读 · 0 评论 -
Java并发编程之阻塞队列
ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按FIFO(先进先出)原则对元素进行排序。LinkedBlockingQueue:是一个基于链表结构的阻塞队列,此队列按FIFO(先进先出)排序元素,吞吐量通常高于ArrayBlockingQueue。SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入...原创 2019-06-05 16:07:50 · 160 阅读 · 0 评论 -
Java并发编程之ReadWriteLock读写锁
ReadWriteLock:读写锁如果可能发生线程安全问题,就直接上锁,虽然可以避免线程安全问题,但效率较低。我们可以将其按读与写进行分离,每一次只能有一个线程来进行写数据,但可以有多个线程进行读数据,写与写互斥、写与读互斥,但是读与读不需要互斥。读写锁互斥原则写—写 需要互斥读—写 需要互斥读—读 不需要互斥读写锁实例public class ReadWriteLock...原创 2019-05-04 14:31:28 · 403 阅读 · 0 评论 -
Java并发编程之Exchanger的使用
Exchanger介绍类Exchanger可以使2个线程之间进行数据传输,它比生产者、消费者模式使用wait/notify要更加方便。Exchanger的使用public class MyThread implements Runnable{ private Exchanger<String> exchanger=new Exchanger<>(); @O...原创 2019-05-04 14:25:12 · 425 阅读 · 0 评论 -
Java基础之对象流与对象的序列化和反序列化
ObjectInputStream和ObjectOutputStream用于存储和读取对象的处理流。它的强大之处就是可以把java中的对象写入到数据源中,也能把对象从数据源中还原回来。序列化(Serialize)用ObjectOutputStream类将一个java对象写入IO流中对象的序列化机制允许把内存中的java对象转换成平台无关的二进制流,从而运行把这种二进制流持久地保存在...原创 2019-04-19 15:24:51 · 370 阅读 · 0 评论 -
Java并发编程之Semaphore信号量控制
Semaphone介绍通过 Semaphore,可以很容易控制某一个资源可被同时访问的个数。它维护了当前访问的个数,提供同步机制来控制同时访问个数Semaphore 对象被实例化时,需要告诉它许可的个数,线程只有获取许可,才能对资源进行访问。Semaphore 提供了两个方法对资源的访问进行控制acquire():获取一个许可,如果没有,就等待release():操作完成后,释放一...原创 2019-04-20 17:11:19 · 398 阅读 · 0 评论 -
Java并发编程之CyclicBarrier
CyclicBarrier介绍CyclicBarrier运行一组线程相互等待,直到到达某个公共的屏障点。它是通过计数器来实现的,当某个线程调用了await()方法后,该线程就进入了等待状态,计数器执行加1操作,当计数器的值达到了设置的初始值的时候,调用await()进入等待状态的线程会被唤醒,继续执行他们后续的操作。由于CyclicBarrier在释放等待线程后可以重用,所以我们又称它为循环...原创 2019-04-20 17:07:34 · 154 阅读 · 0 评论 -
设计模式之工厂设计模式
具体内容实际上工厂设计模式是一种实例化对象的标准结构。在正常操作中,如果想要实例化一个接口对象,往往会直接利用关键字 new。//定义一个水果接口interface Fruit{ public void eat();}//如果想要吃苹果,就实现吃水果接口class Apple implements Fruit{ public void eat() { System.out....原创 2019-04-13 00:09:17 · 151 阅读 · 0 评论 -
Java基础之反射
反射概述Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射机制提供的功能在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类所具有的成员变量和方法在运行时调用任意一个对象的成员变量和方法生成动态代理反射相关的主要API...原创 2019-04-13 00:15:57 · 109 阅读 · 0 评论 -
Java并发编程之ThreadLocal
本地线程变量变量值共享可以使用public static 变量的形式,所有的线程都可以使用同一个变量。但是如果想要每一个线程都有自己的共享变量,就可以使用ThreadLocal。ThreadLocal的实现原理Thread类中保存着ThreadLocalMap属性,默认为空。ThreadLocalMap类为ThreadLocal的内部类,其内部可以存储键值对类型的数据,它的键...原创 2019-04-07 19:51:55 · 136 阅读 · 0 评论 -
设计模式之单例模式与多线程
单例模式确保某个类只有一个实例,并且自行实例化,并向整个系统提供这个实例立即加载/饿汉模式调用方法前,实例已经被创建public class Single1 { //立即加载、饿汉模式 private static Single1 single1=new Single1(); //私有构造 //定义为private,避免在外部被实例化 private Single1(...原创 2019-04-07 19:40:39 · 143 阅读 · 0 评论 -
等待唤醒机制实现生产者消费者模型
商城类public class Tmail { //产品数量 private int count; //产品的最大容量 public final int MAX_COUNT=10; //消费者生产产品 public synchronized void push(){ while(count>=MAX_COUNT){ try { System.out.print...原创 2019-05-04 14:35:56 · 410 阅读 · 0 评论 -
Java并发编程之ThreadPoolExecutor的使用
构造方法类ThreadPoolExecutor最常用的构造方法是:ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime ,TimeUnit unit,BlockingQueue<Runnable> workQueue)corePoolSize:线程池中标准...原创 2019-04-20 15:02:28 · 242 阅读 · 0 评论 -
Java基础之内部类的分类
在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。成员内部类1)、非静态内部类非静态内部类必须存在一个外部类对象里。因此,如果有一个非静态内部类,那么一定存在对应的外部类对象。非静态内部对象单独属于外部类的某个对象。 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。 非静态内部类不能有静态方法、静态属...原创 2019-05-21 16:42:39 · 172 阅读 · 0 评论 -
Java基础之浮点型变量和BigDecimal的使用
带小数的数据在Java中称为浮点型,浮点型可以分为float类型和double类型。 类型 占用存储空间 表数范围 float 4字节 -3.403E38~3.403E38 double 8字节 -1.798E308~...原创 2019-05-21 16:37:17 · 1376 阅读 · 0 评论 -
Java基础之RandomAccessFile随机访问流
RandomAccessFile介绍随机访问文件,自身具备读写方法通过skipBytes(int x),seek(int x)来达到随机访问特点该对象既能读,又能写该对象维护了一个byte数组,并通过指针可以操作数组中的元素可以通过getFilePointer方法获取指针的位置,通过seek方法设置指针的位置其实该对象就是将字节输入流和输出流进行了封装该...原创 2019-05-21 16:29:49 · 960 阅读 · 0 评论 -
缓存设计与优化
缓存的受益与成本受益加速读写通过缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果。降低后端负载后端服务器通过前端缓存降低负载:业务端使用Redis降低后端MySQL负载等。成本数据不一致:缓存层和数据层有时间窗口不一致,和更新策略有关。 代码维护成本:多了一层缓存逻辑...原创 2019-05-21 16:22:33 · 492 阅读 · 0 评论