自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 问答 (2)
  • 收藏
  • 关注

原创 Java并发(四)synchronized关键字(2)优化

一.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是 synchronized。举例,流程假设有两个方法同步块,利用同一个对象加锁static final Object obj = new Object();public static void method1() { synchronized( obj ) { // 同步块 A method2(); }}publ

2020-10-31 16:56:34 111

原创 LeetCode(十)二叉树相关-#110

110. 平衡二叉树1.题目描述及示例题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例2.题解思路及代码思路简单,略。代码 boolean tag=true; public boolean isBalanced(TreeNode root) { preOrder(root); return tag; }

2020-10-31 16:10:33 80

原创 LeetCode(十)二叉树遍历相关-层次遍历-#102

102. 二叉树的层序遍历1.题目描述及示例题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例2.题解思路及代码思路主要是怎么确定每层有多少个。当第i层的第一个节点开始出队时,第i+1层的第一个节点开始入队。当第i层的最后一个节点出队时,第i+1层的最后一个节点也入队了。也就是说,此时队里只有i+1层的节点。这样一层层的遍历。代码public List<List<Integer>> levelO

2020-10-31 16:04:45 91

原创 LeetCode(十)二叉树遍历相关-二叉树非递归遍历

一.前序 #144 public List<Integer> preorderTraversal(TreeNode root) { List<Integer>list=new ArrayList<>(); TreeNode p=root; Stack<TreeNode> stack=new Stack<>(); if (p!=null) stack

2020-10-31 15:51:22 70

原创 Java并发(四)synchronized关键字(1)基本原理

一.用法就记住一点:synchronized修饰非静态方法时,锁是this,即当前的实例对象。synchronized修饰静态方法时,锁是类对象。.理

2020-10-31 15:19:10 107

原创 LeetCode(十)二叉树相关-#1325

public TreeNode removeLeafNodes(TreeNode root, int target) { root=postOrder(root,target); return root; } public TreeNode postOrder(TreeNode root,int target) { if (root!=null) { root.left=postOrder(roo

2020-10-28 18:01:54 117

原创 LeetCode(十)二叉树相关-#236

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { return postOrder(root,p,q); } public TreeNode postOrder(TreeNode root, TreeNode p, TreeNode q) { if (root==null) return null; ...

2020-10-28 17:46:50 63

原创 LeetCode(十)二叉树相关-#226

public TreeNode invertTree(TreeNode root) { invert(root); return root; } public void invert(TreeNode root) { if (root!=null){ TreeNode temp=root.left; root.left=root.rig...

2020-10-28 17:34:18 48

原创 LeetCode(十)二叉树相关-#104

int max=0; public int maxDepth(TreeNode root) { if (root!=null) { preOrder(root,1); return max; } return 0; } public void preOrder(TreeNode root,int depth) { ...

2020-10-28 17:32:01 53

原创 Java并发(三)Java线程的状态

参考:https://blog.csdn.net/pange1991/article/details/53860651举例 public static void main(String[] args) throws InterruptedException { Thread t1=new Thread("t1") { @Override public void run() { Syste

2020-10-28 15:35:35 129

原创 Java并发(二)常用方法04之setDaemon()

一.介绍在调用线程A的start()之前,先调用线程A的setDaemon(),可以将线程A设置为守护线程。只要其他非守护线程运行结束了,即使守护线程的代码没有执行完,该守护线程也会强制结束二.使用class myRunnable implements Runnable{ public void run() { while (true) { try { Thread.sleep(20);

2020-10-28 15:11:28 277

原创 Java并发(二)常用方法03之interrupt()相关

一.简介中断在java中主要有3个方法,interrupt(),isInterrupted()和interrupted()。interrupt(),在A线程中调用B线程的interrupt()方法,即会向B线程发出信号——线程中断状态已被设置。至于那个线程何去何从,由具体的代码实现决定。isInterrupted(),用来判断当前线程的中断状态(true or false)。二.使用及注意点interrupt()interrupt()不能中断在运行中的线程,它只能改变中断状态而已。//

2020-10-28 14:56:34 135

原创 LeetCode(十)二叉树相关-#101

int tag=0; public boolean isSymmetric(TreeNode root) { if (root==null) return true; TreeNode left=root.left; TreeNode right=root.right; isSame(left,right); if (tag==1) ...

2020-10-27 15:22:24 60

原创 Java并发(二)常用方法02之join()

一.作用Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用B线程的join方法,A会等待B执行完后,再执行后面的代码。 public static void main(String[] args) throws InterruptedException { Runnable task=()->{ try { Thread.sleep(5000);

2020-10-27 10:24:48 499

原创 Java并发(二)常用方法01之sleep()和yield()

一.sleep()Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedException中断异常。 public static void main(String[] args) { Runnable task=()->{ try { Thread.sleep(10000); } catch

2020-10-27 10:10:21 139

原创 Java并发(一)创建线程的方式

创建线程的方式一.继承Thread类简单,略。二.实现Runnable接口简单,但要注意还有lambda方式的写法: public static void main(String[] args) { Runnable task=()->{ System.out.println("lambda表达式"); }; Thread thread=new Thread(task); thread.start(

2020-10-27 09:31:05 63

原创 LeetCode(九)堆相关-#347

215. 数组中的第K个最大元素1.题目描述及示例题目描述给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例2.题解思路及代码思路(1)这种题目最适合用堆排序,参考算法笔记的内容(2)前期需要记录不同的数字出现的次数,但题中没有给出数的范围,不能用数组散列的方式,只能用map记录。代码 class Node { int id; int count; public Node(int id,int count

2020-10-24 18:41:18 65

原创 LeetCode(九)堆相关-#215

215. 数组中的第K个最大元素1.题目描述及示例题目描述在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例2.题解思路及代码思路(1)参考算法笔记的内容(2)通常情况下,非叶节点的下标是i,则其左孩子的下标为2 * i。但数组的下标是从0开始而不是从1开始,所以下标要调整,非叶节点的下标是i,则其左孩子的下标为2*i-1。代码 public int findKthLargest(int[] n

2020-10-23 15:38:33 60

原创 LeetCode(八)栈相关-#316

316. 去除重复字母1.题目描述及示例题目描述给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例2.题解思路及代码思路参考:https://leetcode-cn.com/problems/remove-duplicate-letters/solution/you-qian-ru-shen-dan-diao-zhan-si-lu-qu-chu-zhong-/代码 publ

2020-10-23 08:51:07 103

原创 LeetCode(八)栈相关-#224

224. 基本计算器1.题目描述及示例题目描述实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。示例2.题解思路及代码思路参考《算法笔记》中,关于栈这节的内容代码 public int calculate(String s) { s=s.trim(); int [] nums=new int[s.length()]; int

2020-10-22 16:07:48 67

原创 LeetCode(八)栈相关-#20

20. 有效的括号1.题目描述及示例题目描述示例2.题解思路及代码思路比较简单,略。代码 public boolean isValid(String s) { char[] chars=new char[s.length()]; int i=0; if (s==null||s.length()==0) return true; for (int j=0;j<s.lengt

2020-10-20 17:55:44 79

原创 LeetCode(七)数组操作-#945

945. 使数组唯一的最小增量1.题目描述及示例题目描述给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。返回使 A 中的每个值都是唯一的最少操作次数。示例2.题解思路及代码思路先排序,再依次遍历数组元素,若当前元素小于等于它前一个元素,则将其变为前一个数 +1。这是比较常规的方法,最屌的方法见第二个代码块代码//常规思路 public int minIncrementForUnique(int[] A) { int

2020-10-19 10:55:12 85

原创 LeetCode(七)数组操作-#581

581. 最短无序连续子数组1.题目描述及示例题目描述给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。示例2.题解思路及代码思路要找到失序数字中的最大值和最小值,以及它们所处的位置(1)对数组中的递减序列,找到这些序列的最大值和最小值。例如:(一){2,6,4,8,10,9,15}中,递减序列有{6,4}和{10,9},所以min=4,max=10,然后找到min和max在数

2020-10-19 10:38:45 93

原创 LeetCode(七)数组操作-#78

List<List<Integer>> res = new ArrayList<>(1 << nums.length); //先添加一个空的集合 res.add(new ArrayList<>()); for (int num : nums) { //每遍历一个元素就在之前子集中的每个集合追加这个元素,让他变成新的子集 for (int i = 0, j = res.size(); i...

2020-10-19 09:42:38 110

原创 LeetCode(七)数组操作-#73

public void setZero(int[][] matrix,int i,int j,int unique) { for (int jj=j-1;jj>=0;jj--) { if (matrix[i][jj]!=0) matrix[i][jj]=unique; } for (int ii=i-1;ii>=0;ii--) { ...

2020-10-19 09:25:06 110

原创 LeetCode(七)数组操作-#54

public List<Integer> spiralOrder(int[][] matrix) { List<Integer>list=new ArrayList<Integer>(); if (matrix.length==0||matrix==null) return list; int length=matrix[0].length; int height=

2020-10-19 09:05:49 89

原创 LeetCode(六)数字操作-#258

public int addDigits(int num) { if (num%9==0) return (num==0)? 0:9; else return num%9; }

2020-10-17 10:25:00 99

原创 LeetCode(六)数字操作-#172

public int trailingZeroes(int n) { int num=0; while (n>=5) { num+=n/5; n/=5; } return num; }

2020-10-17 10:12:56 59

原创 LeetCode(六)数字操作-#43

public String multiply(String num1, String num2) { if (num1.equals("0")||num2.equals("0")) return "0"; if (num1.length()<num2.length()) { String temp=num1; num1=num2; num2=temp...

2020-10-17 09:32:19 74

原创 LeetCode(六)数字操作-#9

public boolean isPalindrome(int x) { // 特殊情况: // 如上所述,当 x < 0 时,x 不是回文数。 // 同样地,如果数字的最后一位是 0,为了使该数字为回文, // 则其第一位数字也应该是 0 // 只有 0 满足这一属性 if (x < 0 || (x % 10 == 0 && x != 0)) { re...

2020-10-17 09:26:41 150

原创 LeetCode(六)数字操作-#8

public int myAtoi(String s) { int tag=0; int start=0; for (int i=0;i<s.length();i++) { char c=s.charAt(i); if (c==' ') continue; else if (c=='-') { ...

2020-10-17 09:16:07 92

原创 LeetCode(六)数字操作-#7

public int reverse(int x) { int res = 0; while(x!=0) { //每次取末尾数字 int tmp = x%10; //判断是否 大于 最大32位整数 if (res>214748364 || (res==214748364 && tmp>7)) { return 0;...

2020-10-17 08:49:46 92

原创 LeetCode(五)字符串操作-#763

763. 划分字母区间1.题目描述及示例题目描述字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。示例2.题解思路及代码思路我的思路其实和标准答案差不多,只是没有从一开始就把每个字母在字符串中最后出现的位置记录下来,所以在分段的时候做了大量重复工作。代码public List<Integer> partitionLabels(String S) {

2020-10-10 18:47:26 114

原创 LeetCode(五)字符串操作-#14

14. 最长公共前缀1.题目描述及示例题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例2.题解思路及代码思路这里说明一下,我的思路有点挫,这个是别人的思路代码 public String longestCommonPrefix(String[] strs) { if(strs.length == 0) return ""; String ans =

2020-10-10 18:38:49 130

原创 LeetCode(五)字符串操作-#6

6. Z 字形变换1.题目描述及示例题目描述示例2.题解思路及代码思路我的思路不太好用语言描述,numRows代表z字形状有多少行,0 ~ numRows-1行算一种情况,1 ~ numRows-2行算一种情况,两种情况分别处理。。。。。。。。。。。。算了,看别人的解析吧,他的思路要简洁一些https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/代码

2020-10-08 15:46:25 99

原创 Java基础(一)集合框架

https://www.cnblogs.com/bingyimeiling/p/10255037.html

2020-10-07 18:09:16 51

原创 JVM(三-二)类加载器与双亲委派模型

类加载器与双亲委派模型一.类加载器类加载器负责加载所有的类,其为所有被载入内存中的类生成一个java.lang.Class实例对象。一旦一个类被加载如JVM中,同一个类就不会被再次载入了。正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识。在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。例如,如果在pg的包中有一个名为Person的类,被类加载器ClassLoader的实例kl负责加载,则该Person类对应

2020-10-07 15:30:46 122

原创 LeetCode(四)区间合并-#56

56. 合并区间1.题目描述及示例题目描述给出一个区间的集合,请合并所有重叠的区间。示例2.题解思路及代码思路先对二维数组按第一列元素升序排序,咋写的要记住,经常忘记,之后的思路和#26《删除排序数组中的重复项》差不多。代码public int[][] merge(int[][] intervals) { if (intervals.length<=1) return intervals; Arra

2020-10-07 14:36:53 104

原创 LeetCode(三)快慢指针-#202

202. 快乐数1.题目描述及示例题目描述编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。示例2.题解思路及代码思路定义:正整数按各个位上的数先平方,再相加求和,这种运算称为f运算,记作f(x)。例如:x=19,f

2020-10-06 18:35:17 81

原创 LeetCode(三)快慢指针-#876

876. 链表的中间结点1.题目描述及示例题目描述给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例示例1输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val

2020-10-06 17:32:43 54

空空如也

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

TA关注的人

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