自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发编程---------读写锁

什么是读写锁?读写锁本质上维护了一对锁,一个读锁,一个写锁。通过锁分离从而提高并发性。jdk1.5之前只能依托synchronized关键字 进行等待/通知机制,来实现该功能。jdk1.5之后便有了读锁写的支持,Java并发包也提供了读锁写的实现ReentrantReadWriteLock读锁和写锁的注意点1.两者,都是互斥的。 就是当 当前线程 要获取 写锁,而此时该共享资源已经被其他线程的读锁所占有,只能阻塞当前线程。同理,当 当前线程 要获取读锁时,而其他线程的写锁占有该资源,当前线程被迫

2021-12-23 13:38:02 283

原创 并发编程---------可重入锁

什么是可重入锁?指的是同一个线程可以对共享资源进行重复加锁。具体的实现的可重入锁Synchronized -------隐式实现ReentrantLock这里我就比较重点的描述ReentrantLock。虽然没有和Synchronized一样具有隐式重进入,但能保证调用lock()方法,再次调用lock()方法不会阻塞当前线程。如何实现重进入呢?ReentrantLock是通过组合自定义同步器来实现所得获取以及释放。其实是用一个整型变量来记录锁次数。-----------

2021-12-23 12:58:04 423

原创 并发编程------volatile

什么是volatile?------------ volatile 是一个关键字,修饰变量(共享变量)。volatile作用------------对于修饰的变量,确保共享变量能被准确和一致地更新,通俗的理解就是多线程情况下,别的线程对共享变量的修改,当前线程也能及时获取到最新值。例如------代码举例:public static boolean run = true; public static void main(String[] args) throws InterruptedExce

2021-12-20 14:03:29 171

原创 并发编程------cas

什么是cas?cas 的全称即是 Compare And Swap ,是具有原子性的。通俗的理解就是cup的一条并发指令。cas操作是一种无锁操作,是在多线程下,当有线程访问一个共享资源时,要确定当前该资源是否有其他线程占用,并会自旋获取共享资源。基本原理cas的实现是基于Unsafe类中的CAS方法的调用,通过jvm实现汇编指令。cas思想–代码实现 public CAS{ private volatile int value; public vo

2021-12-20 13:19:50 196

原创 设计模式——工厂模式(实例讲解)

对于Java设计模式中的工厂模式而言,针对类别可分为简单工厂模式,工厂方法模式。而对应抽象的话分为工厂方法模式,抽象工厂模式。工厂模式其实就是,将类的实例化以及方法隐藏起来,通过new一个对象,实现用户需求。这里通过一个例子对应列举简单工厂模式:我们现在有一个订单,要求各种蛋糕,客户根据需求订购蛋糕,商家接收蛋糕订单,对应生产蛋糕。1.首先创建产品(Cake)父类:public abstract class Cake { protected String name; public abs

2021-11-21 17:44:58 451

原创 Java多线程(一)

线程创建线程的创建分两种类型1.线程任务内部类2.线程与任务分开代码演示:// 线程与任务分开 Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("running"); } }; Thread t1 = new Thread(runnable, "t1..

2021-11-20 20:44:04 64

原创 一个线程‘优雅‘结束另一个线程

优雅这一说,其实就是在该线程即将结束时,让其做一部分收尾工作,最后再将其结束。对于多线程情况下,一个线程要结束其他线程需要保证,结束该线程的时候释放其运行的支援。于是stop()方法就不行,该方法会致使最后线程资源无法释放,可能永远无法释放。优雅 即是 运用interruted()方法,来实现这一优雅。那么给大家列个类举个例子class TwoTerminna { private Thread monitor; public TwoTerminna() {

2021-11-18 01:16:33 1166

原创 剑指 Offer 35. 复杂链表的复制 java

题目描述:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof这道题我一开始很懵逼,这不是很简单嘛。。。直接一开始就返回一个head节点。后面自己又仔细想想应该是有这样的信息节点,但这些节点并未连接起来。所以,直观的理解就是接下来的代码

2021-11-06 20:33:43 117

原创 手写 PriorityQueue的实现 java

对于一个堆结构来说,我们应用的很广。常见的就有我们学的八大排序之一的而堆排序。其实堆就是一个完全二叉树结构(逻辑结构),但我们真实实现的底层是基于数组。首先,我们温故一下堆排序,然后通过这一理念对应想想PriorityQueue的一些方法于是我们就可以实现一些功能,这边我只实现一部分比较常用的功能。先堆排序:代码://用来交换数值public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = ar

2021-11-03 12:42:15 194

原创 剑指 Offer 59 - I. 滑动窗口的最大值 java

这道题一看题目,很明显就是滑动窗口类型。是的,虽然难度是困难,但其实细分下去是很简单的,但是我还是想分享一下我的做题历程,这道题很显然我第一眼望去就是PriorityQueue堆结构来实现。于是开始了。(这里我就不描述题目了)public int[] maxSlidingWindow(int[] nums, int k) { int []arr=new int [nums.length-k+1]; if(nums.length==0||k==0) return new i

2021-11-03 11:22:59 757

原创 剑指 Offer 26. 树的子结构 java

题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3/ \4 5/ 1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof例子:输入:A = [1,2,3], B = [3,1]输出:fals

2021-11-02 09:30:37 84

原创 剑指 Offer 14- II. 剪绳子 II java

题目描述:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。链接:https://leetcode-cn.com/problem

2021-10-31 16:49:54 101

原创 剑指 Offer 07. 重建二叉树 java递归

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof这道题显然遍历还原二叉树,一般递归的思路会比较简单,对应左右子树的返

2021-10-30 23:57:48 70

原创 Java虚拟机栈

XX定义:1.java虚拟机栈,早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内存保存一个个栈帧,对应着一次次的Java方法调用。2.并且Java虚拟机栈是线程私有的。XX生命周期:于线程一致。(虚拟机栈是因为线程而产生的,当线程消失,虚拟机随即消失)XX作用:主管Java程序的运行,他保存的方法的局部变量(基本类型,以及引用类型变量)、部分结果,并参与方法的调用和返回。XXX 虚拟机为什么要用栈来存储信息呢?栈的优点:1.栈是一种有效快速的分配存储方式,访问速度仅次于程序计

2021-10-27 21:27:07 163

原创 力扣:一和零 java

题目描述:给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。链接:https://leetcode-cn.com/problems/ones-and-zeroes输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个

2021-10-27 12:08:23 103

原创 最后一块石头的重量 II java

这道题其实也是01背包问题,废话不多说直接看代码喽。因为这道题的思路和我上篇发布的其实是一样的,所以在这就一带而过咯。。 public int lastStoneWeightII(int[] stones) { int n=stones.length; int sum=0; for(int i=0;i<n;i++){ sum+=stones[i]; } int weigh

2021-10-26 23:54:39 98

原创 分割等和子集 java

动态规划应用于不同场景,所以很多时候还是要靠我们自己分析这道题是否属于动规的求解,例如最优解,背包,子序列等等。但是关键的还是具体问题具体分析。那么废话不多说,进入主题。题目描述:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。例子:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。这道题乍一看,我的第一想法,暴力递归加回溯,于是我开始了。 publi

2021-10-25 12:37:48 400

原创 不同的二叉搜索树 动态规划(要点)java

最近小编还是不断地动态规划,通过大多数的动态规划题,还是总结出一些经验,以及解动态规划一些步骤要点,并结合例子,让大家熟悉该解题方法。虽然给出了方法但是具体问题具体分析,还是得分析题目不要盲目以为跟着步骤就可以解出来。动态规划的重要四点。(动态规划四步骤)定义的dp数组对应下标值的含义。确认递推公式(不断尝试暴力尝试,还要结合特殊情况)初始化数值循环嵌套的顺序接下来举一个例子让大家熟悉该四步骤。问题描述:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜

2021-10-23 22:20:41 132

原创 多段图最短路径动态规划 Java版

多端图的描述其实就是有向图。对应的算法书这块,大家可以在学习算法时就会接触到关于最短路径的求解。例图:就是在这样的图去寻找V1到V5的最短路径。那么思路是什么?明确目标:V1到V5并且是一个可通图路径长度最短这样一来思路就很清晰。设立数组value[]来表示对应到12个端点的最值。value[i]表示由0-i 的最短路径。对应的代码: public static int []value; public static int fun(int[][] arr, int a) {

2021-10-22 19:35:40 1185

原创 二分查找算法

什么是二分查找?其实就是将你要查找的东西分两半,通过中间值,判断是左半边还是右半边。于是引出了关于二分查找的条件。条件:有序无重复二分查找相对于暴力查找,时间复杂度是O(log n)级别的,所以对我们来说二分查找也是很重要的。二分查找的单纯思路其实是很简单的,类似于递归(归并排序),但是实际编写起来还是有很多细节要去扣的。对于区间有两种分类对应不同的细节。[ x , y ), [ x , y ]。第一种左闭右开:代码: public int search(int[] nums, int

2021-10-21 12:54:01 67

原创 最长递增子序列

又是被动态规划安排的一天,今天本想着按原来的思路做动态规划无奈能力不足,搞了半天,最终还是放弃暴力递归这块。那就让我们进入正题。问题描述:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7]的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为

2021-10-21 00:02:33 89

原创 力扣数组组合Ⅳ

今天,小编在力扣去找寻一些动态规划的题目尝试,感受动态规划的神奇之处,那就废话不多说,直接上题。题目描述:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。举例:输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(

2021-10-20 00:37:34 157

原创 利用HashMap,TreeMap实现结构体

通过牛客网的洗礼,小编开始发现其实数据结构描绘的一些结构图,其实也可以利用HashMap,TreeMap来实现我们脑中的虚拟图。通过一个题目一起来感受一下。题目描述:看到题目的长度,大家千万别被吓到,其实这道题目实际考察点,只有一个结构的关联建立起来,通过遍历比较大小便可以得出最终结果,而实际的难度在于我们如何构建联系,以及实现题目两个表的结构体。解题思路:如果这道题正面解,那么需要考虑以及遍历的次数可能多起来,时间复杂度也会增加,换个解法,既然一定要最后一个H点的参与,我们直接通过最后节点然后逐

2021-10-18 23:25:00 132

原创 暴力递归与动态规划

身为小白的我,最近再刷动态规划的题目。一开始刷题也是跟着题解那样,直击状态转移方程。但有时候这个状态转移方程并非那么好找,而且在不同条件情况下,我们的状态转移方程也得随机条件而改变。所以,最近刷这类动态规划题,让我感到很吃力。但是通过一定题量还是能总结出一定的规律,下面让我用一道例题和大家分享一下我的学习成果。问题描述给定一个只由 0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种字符组成 的字符串express,再给定一个布尔值desired。返回express能有多少种组合 方

2021-10-16 11:33:19 100

原创 最大搜索二叉树的节点数

牛客网刷题问题描述:找到一棵二叉树中,最大的搜索二叉子树,返回最大搜索二叉子树的节点个数。需要解决的问题:判断二叉树是搜索二叉树并且返回最大搜索二叉树的节点数什么是搜索二叉树?搜索二叉树俗称排序二叉树,通过这个名字可以大概了解就是左孩子的数值小于双亲结点,并且满足右孩子节点的数值大于双亲节点。同时子树也满足这个特点。对应这个点也是我们解决问题的一个依据点。返回最大搜索二叉树?这个如果我们要一一遍历二叉树,通过某种记录方法,这样时间复杂度增加同时,还需要编写各种方法体判断搜索二叉

2021-10-14 22:37:45 135

原创 初识TreeMap及应用

初识TreeMap及应用1.什么是TreeMap?其实TreeMap的底层实现就是红黑树。红黑树不仅是平衡二叉树,也是排序二叉树,通过这一些基本的大致了解,就可以去应用该类。如果想要更深入的了解可以通过: http://cmsblogs.com/?p=1013。2.简单应用(常用)构造方法三种:(1) TreeMap()(2)TreeMap(Comparator<? super K> comparator)(3)TreeMap(Map<? extends K, ? ext

2021-10-13 22:29:58 146

原创 牛客网刷题

牛客网刷题 牛客网刷题问题描述:给你一个字符串类型的数组arr,譬如: String[] arr = { “b\cst”, “d\”, “a\d\e”, “a\b\c” }; 你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录 向右进两格,就像这样:a口口b口口口口c口口d口口口口eb口口cstd同一级的需要按字母顺序排列,不能乱。解题思路:该题型其实是一个前缀树的一种变化,将所给的字符串对应树

2021-10-13 00:27:25 153

空空如也

空空如也

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

TA关注的人

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