自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 初探ThreadLocal

一、ThreadLocal是干什么的ThreadLocal是用来在多线程时存储线程内部的局部变量,各个线程之间的变量是独立的不会相互影响。(个人理解为以当前线程为key,以变量为value存储变量)二、基本使用空参构造,创建ThreadLocal对象。public void set(T value)设置当前线程绑定的局部变量public T get()获取当前线程绑定的局部变量public void remove() 移除当前线程绑定的局部变量protected T initialValue(

2020-08-29 12:43:49 204

原创 Java-JUC并发笔记

一、什么的JUC是java.util.concurrent包下的。我们原本多线程普通的是用Thread类,Runable类和Callable类。而JUC是并发包,用来提高效率。二、线程和进程进程:运行起来的程序,一个进程往往可以包含多个线程至少包含一个。Java至少包含2个线程,main线程和gc线程(资源调度的最小单位)。线程:CPU调度和执行的最小单位。Java并不能真正的开启一个线程。因为底层是通过本地方法来调用底层的C++来开启线程。并发和并行并发:多线程操作一个资源。单核CPU模拟出

2020-08-16 14:38:53 230

原创 设计模式总结

一、单例模式为了保证某个类只有一个实例对象。两种方法:懒汉式和饿汉式。饿汉式:缺点:会在一开始就创建对象。优点:线程安全。class Singleton { //1.私有化构造器 private Singleton(){}; //2.静态构造实例对象 private static Singleton singleton=new Singleton(); //3.提供调用方法 public static Singleton getInstance(){

2020-08-15 21:41:39 108

原创 Java集合框架总结

Java的集合框架分为Collection接口和Map接口。Collection接口分为List接口和Set接口。List接口存储有序的、可重复的数据。ArrayList、LinkedList、Vector。Set接口存储无序的、不可重复的数据。HashSet、LinkedSet、TreeSet。Map是双队集合,用来存储一一映射的一对数据。HashMap、LinkedHashMap、TreeMap、HashTable、Properties。ArrayList、LinkedList、Vector的

2020-07-14 21:32:37 128

原创 JavaSE基础易忘知识点总结

学Java几个月了,一直在往下学、复习、往下学…感觉还是需要系统的复习复习。以下知识点均为自己复习总结,可能存在错误。(太过基础的不列举了)一、语言基础switch结构中表达式可以为byte,short,int,char,枚举类型(JDK5新增),String类型(JDK7新增)for(;;)表示for循环的死循环 while循环的死循环为while(true)...

2020-07-11 21:15:39 325

原创 初探JVM

1.JVM位置JVM在操作系统(Window,Linux,Mac)之上。JVM说白了就是个软件,跟个虚拟机软件是一样的。Java程序都是跑在JVM之上的。JVM是用C写的(C+±-)。操作系统之下是硬件。Java程序原本是.java文件,通过javac命令编译成Class.File,之后经过类加载器Class Loader,之后加载到JVM中。JVM包含堆(堆Heap还包含方法区),方法区(Method Area特殊的堆),Java栈(Stack),本地方法栈(Native Method Area),程

2020-05-25 11:07:49 207

原创 Leetcode刷题之旅--剑指 Offer 47. 礼物的最大价值

题目描述:思路:满典型的动态规划。第一行元素与其左侧元素有关,第一列元素与其上侧元素有关,其他元素与左侧和上侧最大的那个有关。class Solution { public int maxValue(int[][] grid) { int m=grid.length; int n=grid[0].length; int[][]result=new int[m][n]; result[0][0]=grid[0][0];

2020-09-15 09:15:38 253

原创 Leetcode刷题之旅--剑指 Offer 45. 把数组排成最小的数

题目描述:思路:数字拼接的大小拥有规律。如果x>y则x+y>y+x,所以本质上是一个数字排序的做法。class Solution { public String minNumber(int[] nums) { String[] strs = new String[nums.length]; for(int i = 0; i < nums.length; i++) { strs[i] = String.valueOf(nu

2020-09-14 09:31:41 256

原创 Leetcode刷题之旅(每日一题)--79. 单词搜索

题目描述:思路:很典型的深度优先+回溯。题解中对于方向的解决方法十分巧妙。使用了二维数组来代表方向选择,避免了自己写很多的重复代码。class Solution { public boolean exist(char[][] board, String word) { int m=board.length; int n=board[0].length; boolean [][] visited=new boolean[m][n];

2020-09-13 08:59:42 282

原创 Leetcode刷题之旅--剑指 Offer 44. 数字序列中某一位的数字

题目描述:思路:说实话,完全没思路。看了题解后发现,这是个找规律的题。。。0 占第0位1~9 共9x1 = 9个数字 占位9x1 = 9 位10~99 共9x10 = 90个数字 占位90x2 = 180 位100~999 共9x100 = 900个数字 占位900x3 = 2700 位…附上题解代码class Solution { public int findNthDigit(int n) { int digit = 1; long start

2020-09-12 09:44:03 210

原创 Leetcode刷题之旅(每日一题)--637. 二叉树的层平均值

题目描述:思路:个人习惯–>层序遍历,记录每层结点数以及数值之和。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List<Double

2020-09-12 09:27:21 91

原创 Leetcode刷题之旅--剑指 Offer 43. 1~n整数中1出现的次数

题目描述:思路:可以从左向右每个位得到最终的结果。对于每个当前位,其出现1的次数可以根据当前位数字分为三类,0一类,1一类,2~9一类。(语言表达能力有限。。具体解法请参考官方题解吧)class Solution { public int countDigitOne(int n) { int digit = 1, res = 0; int high = n / 10, cur = n % 10, low = 0; while(high != 0

2020-09-08 20:32:51 81

原创 Leetcode刷题之旅--剑指 Offer 50. 第一个只出现一次的字符

题目描述:思路:最暴力的方法–先遍历一遍,用map存储。之后再按照字符串顺序遍历一遍,并查看map存储的数值。可以用有序的LinkedHashMap来对第二次遍历进行优化。另外,map存储出现次数可以使用boolean来节省空间。class Solution { public char firstUniqChar(String s) { char[] word=s.toCharArray(); Map<Character,Boolean> map=

2020-09-03 11:03:25 125

原创 Leetcode刷题之旅--剑指 Offer 42. 连续子数组的最大和

题目描述:思路: 动态规划!每个dp用来代表累加和,如果前一个的和小于0则不加上这个和重新开始,这是因为如果累加和小于0意味着这个累加和对当前数字就没有贡献,加上这个和还不如这个数本身大。只需要每次比较累加和的当前最大的累加和做对比即可。class Solution { public int maxSubArray(int[] nums) { int max=nums[0]; for(int i=1;i<nums.length;i++){

2020-09-02 10:17:31 158

原创 Leetcode刷题之旅--剑指 Offer 40. 最小的k个数

题目描述:思路:两种常用的方法:1.先存储k个数,当后续数字大于其中最大的数时,替换掉其中最大的数,最后剩下的k个数就是结果。2. 用快排的思路,先随机取一个数,将大于他的放到左面,小于他的放到右面,返回当前数字的当前位置,如果比k大,继续向左执行,如果比k小继续向右执行。如果正好相等,则复制到当前前k个数并返回。采用最大堆class Solution { public int[] getLeastNumbers(int[] arr, int k) { if (k==0)re

2020-08-27 09:49:46 103

原创 Leetcode刷题之旅(每日一题)--201. 数字范围按位与

题目描述:思路:首先要理解题目意思,题目要求是求出m&m+1&…&n-1&n。直接求会超出时间限制。实际题目实际上是要求出m,n的公共子前缀,之后再补0.class Solution { public int rangeBitwiseAnd(int m, int n) { int shift=0; while(m!=n){ m=m>>1; n=n>>1;

2020-08-23 09:09:37 95

原创 Leetcode刷题之旅(每日一题)--111. 二叉树的最小深度

题目描述:思路:一开始以为不难,但是直接提交错误。原因:当一个节点只有一个孩子节点时,其深度是孩子结点深度+1,而不是1./** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution {

2020-08-21 09:39:11 90

原创 Leetcode刷题之旅--剑指 Offer 39. 数组中出现次数超过一半的数字

题目描述:思路:第一种思路用Map存储出现次数。class Solution { public int majorityElement(int[] nums) { HashMap <Integer,Integer> map =new HashMap(); int mid=nums.length>>1; for(int i=0;i<nums.length;i++){ int tem=nums[i

2020-08-20 10:59:57 115

原创 Leetcode刷题之旅--剑指 Offer 38. 字符串的排列

题目描述:思路:字符串的全排列,可以用回溯的方法。其中不能有重复元素因此需要剪枝,而且还需要一个容器来看这个字符是否已经排列过。(想了半天思路还是很乱,还是需要借助题解啊。。。)class Solution { List <String> list=new LinkedList(); char[] c; public String[] permutation(String s) { c=s.toCharArray(); dfs(0);

2020-08-19 09:01:45 164

原创 Leetcode刷题之旅(每日一题)--647. 回文子串

题目描述:思路: 中心法向两边扩展。验证以某个或某两个字符为中心扩展的每个字串是否为回文串class Solution { public int countSubstrings(String s) { int len=s.length(); int result=0; for(int i=0;i<len;i++){ result+=subString(s,len,i,i); if(i==len

2020-08-19 08:41:38 114

原创 Leetcode刷题之旅--剑指 Offer 37. 序列化二叉树

题目描述:思路:以前做过的一道题。思路很简单,序列化就是二叉树的层序遍历之后输出字符串。反序列化就是将字符串分割后层序创建二叉树。注意细节即可。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public

2020-08-18 10:03:32 111

原创 Leetcode刷题之旅--剑指 Offer 36. 二叉搜索树与双向链表

题目描述:思路:二叉树的中序遍历是有序的,所以按照二叉树的中序遍历的做法稍加改造调整指针。/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node() {} public Node(int _val) { val = _val; } public Node(int _

2020-08-18 09:43:56 109

原创 Leetcode刷题之旅--剑指 Offer 35. 复杂链表的复制

题目描述:思路: 可以按照图的克隆的做法。用map存放已经新建的克隆Node。/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; }}*/class So

2020-08-12 09:55:14 102

原创 Leetcode刷题之旅(每日一题)--133. 克隆图

题目描述:思路:图可以深度优先或广度优先来遍历,每次遍历一个新顶点都要新创建一个一样的克隆顶点。可以用原顶点作为key,克隆顶点作为value,用一个map来存储已经遍历过的顶点,避免陷入死循环。首先深度优先遍历:/*// Definition for a Node.class Node { public int val; public List<Node> neighbors; public Node() { val = 0;

2020-08-12 09:27:04 87

原创 Leetcode刷题之旅--剑指 Offer 34. 二叉树中和为某一值的路径

题目描述:思路:和原来做过的一样,只不过需要记录路径。可以从根节点递归实现,到下层节点的和为sum减去根节点的数。当和为0,并且为叶子节点时添加记录路径的数组到最终的结果中。当当前节点为null时停止递归。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int

2020-08-11 09:42:07 94

原创 Leetcode刷题之旅--剑指 Offer 33. 二叉搜索树的后序遍历序列

题目描述:思路:对于从二叉树的遍历还原为树一直不太明白,好在看了大神的解答清晰了很多。二叉搜索树的后序遍历是有顺序的,第一个大于根节点的值就是右子树的开始,这样就可以将整个数组分为三部分:左子树(都小于根),右子树(都大于根),根。之后判断左子树内元素是否都小于根,右子树是否都大于根。之后递归查看左子树和右子树。当只有一个节点时(左>=右时),结束递归。class Solution { public boolean verifyPostorder(int[] postorder) {

2020-08-11 09:25:12 102

原创 Leetcode刷题之旅(每日一题)--130. 被围绕的区域

题目描述:思路:题中只需要找到边界的‘O’已经和边界‘O’相连的‘O’,由于题目要求改变字符,因此可以把这些‘O’先改为其他字符,之后最后遍历时将其变回‘O’。首先从最外面四面的框开始看其相邻的是否有‘O’,寻找到与边界都相连的‘O’并将其改为其他字符。对四周的每个字符都深度优先搜索后,遍历整个二维数组,将此时剩余的‘O’变为‘X’,将刚刚改为的其他字符改回为‘O’。class Solution { public void solve(char[][] board) { int

2020-08-11 08:58:28 117

原创 Leetcode刷题之旅--剑指 Offer 32 - I- II-III. 从上到下打印二叉树

题目描述:I-从上到下打印二叉树思路:三道题都是二叉树的层序遍历。第一题很简单,第二题需要额外记录每层,可以用双队列或者标记节点或者记录每层节点个数。第三题在第二题的基础上在适当层数先翻转序列之后添加,或者用双端队列.第一题:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * T

2020-08-10 09:53:57 146

原创 Leetcode刷题之旅(每日一题)--696. 计数二进制子串

题目描述:思路:一开始没明白什么意思,看了题解后明白了是要找10或01这样0和1的数目相同的字串的个数,且字串的0和1都是连续的。可以按照回文子串的想法,先找到0和1的交界处,之后向两边展开。官方题解给出了一种更简单明了的做法,将0和1分组,连续的0和连续的1进行分组计数。如111001011转化为[3,2,1,1,2]这样,之后只需要累加相邻数字的最小值即可。按照这个思路可以得到:class Solution { public int countBinarySubstrings(Strin

2020-08-10 08:55:19 142

原创 Leetcode刷题之旅--剑指 Offer 31. 栈的压入、弹出序列

题目描述:思路:注意题目只需要验证popped数组是否能由pushed数组出入栈得到!!(一开始理解错了自己把题目弄复杂了) 所以只需要借助一个栈来实现。查看栈顶元素和popped数组中元素是否一样,如果一样栈弹出元素popped数组指向下一个元素,如果不一样则pushed数组元素继续入栈。class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Deque <

2020-08-09 10:49:32 95

原创 Leetcode刷题之旅(每日一题)--93. 复原IP地址

题目描述:思路:题目不难,想好输入输出和中间过程,用回溯法递归进行即可。首先需要一个数代表当前是第几个整数,一个代表当前在字符串的哪个位置,并且还需要一个数组来暂时存储数据,一个容器存储结果。如果四个数确认了并且正好遍历完字符串则添加到结果中。如果没确认号四个数字符串就不够了,就结束当前递归。由于每个整数不能是01这样的,所以如果碰到0就认为0是一个整数。class Solution { List<String> list; int[] tem=new int[4];;

2020-08-09 10:14:07 93

原创 Leetcode刷题之旅--剑指 Offer 30. 包含min函数的栈

题目描述:思路:用一个辅助栈来进行帮助。class MinStack { Stack<Integer> A, B; public MinStack() { A = new Stack<>(); B = new Stack<>(); } public void push(int x) { A.add(x); if(B.empty() || B.peek() >= x)

2020-08-08 10:45:27 104

原创 Leetcode刷题之旅(每日一题)--99. 恢复二叉搜索树

题目描述:思路:首先二叉搜索树的中序遍历是升序排列的所以可以先按中序遍历找到不按顺序的结点,之后交换两个结点。下面借助了数组来存储两个交换的结点,可以用其他方法得到两个结点。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNo

2020-08-08 10:27:32 86

原创 Leetcode刷题之旅--剑指 Offer 28. 对称的二叉树

题目描述:思路:1.递归 按镜像的方式递归输入树的结点,查看原树和镜像树是否一样。(建议参照leetcode 101题题解) 2. 可以用队列,先根节点进入两次,之后每次检查两个结点,并将结点的子节点顺序相反的入队列,当队列为空或检查的两个结点不等时结束。编写中得到个教训,能用&&替代if尽量用&&替代if,会大大降低执行时间!!/** * Definition for a binary tree node. * public class TreeNode

2020-08-07 10:26:15 108

原创 Leetcode刷题之旅--剑指 Offer 26. 树的子结构

题目描述:思路:首先遍历A树,找到A树中等于B树根节点的结点,之后以该节点为起始节点,检查B树是否为A树的子结构。要注意一点,题目中没说每个结点的值唯一,因此不能一找到A树种等于B树根节点的结点就停止,而是需要先判断如果相等则停止,否则继续向下寻找A树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode ri

2020-08-07 10:07:28 83

原创 Leetcode刷题之旅(每日一题)--100. 相同的树

题目描述:思路:想到两种方法:1.递归查看每个结点是否相同。2.用栈或队列查看结构。给出递归的做法:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } *

2020-08-07 09:41:28 109

原创 Leetcode刷题之旅(每日一题)--336. 回文对

题目描述:思路:最基本的做法:暴力枚举。枚举每一对字符串的组合,暴力判断它们是否能够构成回文串即可。但是时间复杂度为O(n ^2×m)。深入分析可以降低时间复杂度。如果A+B是回文,则可以分为三种情况:1. A翻转=B 2. A前半部分翻转=B,A后半部分为回文串 3. B后半部分翻转=A,B前半部分为回文串。用哈希表存储各个单词的翻转,而后每个字符是否其所需部分是否存在。带上官方代码:class Solution { List<String> wordsRev = new Ar

2020-08-06 10:31:45 126

原创 Leetcode刷题之旅(每日一题)--337. 打家劫舍 III

题目描述:思路:跟原来一样还是动态规划的思想,但是由于是二叉树并不适合用数组那该怎么办?一开始没想出来,用的递归的思路做的。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution {

2020-08-05 10:44:32 117

原创 Leetcode刷题之旅--剑指 Offer 27. 二叉树的镜像

题目描述:思路:就是反转二叉树。要么递归要么借助栈或队列。要注意一下是否需要生成新的二叉树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public Tree

2020-08-04 10:12:42 98

原创 Leetcode刷题之旅(每日一题)--207. 课程表

题目描述:思路:一开始完全没思路。看了题解后明白了,就是判断有向图是否存在环!深度优先和广度优先都可以做到。对拓扑排序熟悉那么就用广度优先解决吧。首先要根据输入得到图的入读和邻接表。之后就按正常的拓扑排序,入度0的入队列。每个出队列的顶点的相邻节点==顶点入读-1。直到队列为空,最后判断经过队列的顶点数和输入的数是否相等。自己按照这个思路写代码时候发现两个注意点:1.题目中给出的前置课程的表示都是用的[A,B]这样的形式,也就是只有两个顶点。因此来构建邻接表时直接就可以用adjacencyList.g

2020-08-04 10:01:13 149

空空如也

空空如也

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

TA关注的人

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