- 博客(253)
- 收藏
- 关注
原创 Java多线程-线程封闭
发布一个对象是指:使对象能够在当前作用域之外的代码使用。线程的安全性和内部状态息息相关,而内部状态的发布会破坏封装性,将会导致安全性更难保障。逸出:不应该被发布的对象被发布。注:发布一个对象,同样发布了该对象所有非私有域所引用的对象。发布的方式,比如:1 将对象引用存储到公共静态域。2 从公共方法中返回对象引用。3 将对象传递给外部方法。
2017-03-29 16:01:49
877
10
原创 Java多线程-同步
我们的多线程环境,在不同的(不可预测的)调度顺序之下,线程争相运行,走走停停,这是一种异步状态。而同步,虽然叫做同步,但其实是一个一个挨着执行,所以是一种串行。而由于多个线程对于状态的异步访问可能导致安全问题。比如:if( 朋友A不在图书馆 ) {------------------------------------------- A来到图书馆 去
2017-03-29 09:28:13
580
原创 Java多线程-阻塞与中断
Java的多线程调度是一种抢占机制,抢先式调度又分为:时间片方式和独占方式。在时间片方式下,当前活动线程执行完当前时间片后,如果有其他处于就绪状态的相同优先级的线程,系统会将执行权交给其他就绪态的同优先级线程;当前活动线程转入等待执行队列,等待下一个时间片的调度。 在独占方式下,当前活动线程一旦获得执行权,将一直执行下去,直到执行完毕或由于某种原因主动放弃CPU,或者是有一高优先级的线程处
2017-03-25 09:29:56
687
原创 Java多线程-执行器
本文参考:《Thinking in Java》我们在上一篇中知道,可以使用thread的构造器中接收Runnable对象,然后调用start方法开启线程。但是java.util.concurrent包提供了执行器 Executor来管理Thread对象。public class LiftOff implements Runnable{ protected int countDown
2017-03-24 16:04:54
705
原创 Java多线程-基本使用
注:文章代码多摘取自《Thinking in Java》多线程是比多进程更低层次的一种多任务概念。而 线程驱动任务(不要理解为线程就是任务,而应该理解成线程驱动任务)如下:关于Thread.yield() 方法,可以理解为线程让步。当前线程从执行状态(run()方法中)变为就绪状态,而把自己的CPU执行时间让给其他线程。大概可以理解为:我执行的差不多了(run方法的循环中的
2017-03-24 15:04:15
419
原创 leetcode_middle_100_207. Course Schedule
题意:0 到n-1,n门课程,给定一系列的 [ x , y ],代表x的先修课程是y,即必须先修y,判断学生能否修完所有课程。分析:其实就是判断死锁。a锁住了b,b锁住了c,c锁住了d,d锁住了a就不行,很容易就推出,判断有没有圈。本来设置start, end 动态改变,实现后发现不行,因为有些数据之间的课程值能相等。这个方法不行的话,就用笨办法,动态的去除可以解
2017-03-10 15:44:18
291
原创 leetcode_middle_99_16. 3Sum Closest
题意:给定一列数,和一个目标数,查找这一列数中三个数的和中最接近目标数的那个和。分析:这道题非常好,搜索本来就是体现经典算法的操作之一,而搜索算法往往其实质在于动态的缩小搜索空间。我们能动态的接近结果呢? ==》说明新的区间比旧的区间更靠近答案 ==》 无序的数组肯定是办不到的,因为哪哪都一样 ==》我们对数组排序,再继续分析 ==》某一个区间left 到 rig
2017-03-10 14:48:23
261
原创 leetcode_middle_98_95. Unique Binary Search Trees II
题意:给一个数n,返回所有能存储1到n的二叉查找树。分析:这是个好题,应该考虑深度优先搜索或者动态规划。递归好理解:遍历1到n每个数做结点。对于每一个根节点,将左边的结点能构造出的的所有树 以及 将右边的结点能构造出的所有树 求其笛卡尔积:即双重循环遍历。那么,怎么得到呢?递归,传的参数应该就是一串数,递归中又遍历这串数......./** * D
2017-03-10 14:06:28
319
原创 leetcode_middle_97_34. Search for a Range
题意:给一个升序数组,和一个目标数。查找目标数,没找到返回[-1, -1],找到返回目标数的起始坐标和中点坐标分析:二分查找。3333388888444444找8,mid一下就落到8上,所以这个时候,如果low,high不等于teget,那么就顺序(逆序)移动。可能是8888888888 或者 3888888884,当然,如果这时候low,high也都等于
2017-03-10 09:20:26
386
原创 leetcode_middle_96_142. Linked List Cycle II
题意:如果一个链表存在圈,返回圈的开始处,如果不存在,返回null分析:如果一个链表有圈会怎样? ==》 指针顺序遍历永远遍历不到空 ,且会重复走一段路 ==》 如果是两个快慢指针,那么它们一定会相遇 ==》在哪里相遇?我认为最有效的两个思维方式:举例子和画图。来: * —— *
2017-03-10 09:01:06
298
原创 leetcode_middle_96_63. Unique Paths II
题意:从一个矩阵的左上角走到右下角。有多少种走法。0代表空地,1代表障碍物分析:1 动态规划:一个点的路径等于它上方点的路径数加上它左方点的路径数。2 对于障碍物:我们的动态规划的点dp[ i ] [ j ]是针对非障碍物的。而对于障碍物:两点:首先它本身所在位置的路径数为0其次它可达的下一点如果是空地,那么这个空地的路径数不应该加上障碍物之前的路径数。这两
2017-03-09 23:04:07
326
原创 leetcode_middle_95_105. Construct Binary Tree from Preorder and Inorder Traversal
题意:给一个二叉树的前序遍历和中序遍历结果,构造出这棵树。分析:分析同上一篇。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tr
2017-03-09 20:31:33
267
原创 leetcode_middle_94_106. Construct Binary Tree from Inorder and Postorder Traversal
题意:给出一个二叉树的中序遍历和后序遍历的结果,还原构造出这颗树。分析:首先我们应该搞清楚中序遍历和后序遍历的原理。其次,我们应该举个例子,用人脑的思维方式,来完成这个过程。再根据人脑的思维过程来思考怎么控制计算机来完成。比如: 1 2
2017-03-09 20:19:37
323
原创 leetcode_middle_93_47. Permutations II
题意:给一个数组,返回其所有排列。(不重复)分析:说明在搜索树种,每下一层,搜素区间就减1(减掉的那个1,就是父节点本身)以上能得到所有排列但是由于数组中可能有相同的元素,所以排列可能有相同的。所以,可以利用排序,并只将相同元素的第一个进入搜索的方式去掉相同的。public class Solution { List l = null; Li
2017-03-09 18:54:13
264
原创 leetcode_middle_92_131. Palindrome Partitioning
题意:将字符串分割。使每个子串都是回文字符串。返回所有满足条件的分割。分析:这个题一眼望去就应该先把问题分解,一是判断子串是否回文。二是搜索。搜索的话,这种情况适合递归深搜。对于回文判断:传入字符串,一头一尾,两个指针向中间遍历,并比较即可判断。对于搜索:我们每次递归中,应该切割字符串,如果切割下来的是回文,就把这部分放入list,并继续将剩下的字符串送入递归。
2017-03-09 18:13:37
271
原创 leetcode_middle_91_86. Partition List
题意:给一个单链表和一个数值,将链表中小于这个数的结点放前面,大于等于这个数的结点放后面,并保持相对顺序不变,构造新链表。分析:直接一个链表装大的,一个装小的,连起来就是了。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListN
2017-03-09 16:34:37
299
原创 leetcode_middle_90_264. Ugly Number II
题意:丑数是素因子只包含2 3 5的数。1 2 3 4 5 6 8返回第n个丑数分析:第一想法动态规划,找dp[ i ]之前的值乘2 3 5,找这些值里面大于dp[i-1]但是由最小的。测试用例前面的全能过,但是到6000的时候出错。public class Solution { public in
2017-03-09 16:04:49
347
原创 leetcode_middle_89_40. Combination Sum II
题意:给一个无序的,可能有重复的数组。找出其中的数字组合使其之和等于给定数,组合里不能重复使用数组中的某个数,组合之间所包含的值不能相等。分析:这个题就是深搜就可以了。但是关键在于如何避免重复:三个:第一个避免两次使用同一个数:每次遍历都从已经放入的数之后即: for(int i = start; ...;.....){}
2017-03-09 15:37:22
273
原创 leetcode_middle_88_113. Path Sum II
题意:记录二叉树从根节点到叶子结点的所有结点的值为给定数的所有路径。分析:递归深搜即可。但是要注意叶子节点就不要进如递归了,因为叶子节点有两个空子节点,进入递归判断,会出现错误答案。/** * Definition for a binary tree node. * public class TreeNode { * int val; *
2017-03-09 15:24:31
377
原创 leetcode_middle_87_274. H-Index
题意:用插入排序来给一个单链表排序。分析:插入排序是遍历数组,然后,将这个数放在其左边(已经有序)的数组的有序位置。但是链表不能倒序遍历,交换也很麻烦,我们用一个新数组来插入。思路很简单,难的是实现。我一直认为链表只要细心的记录要改变的结点,把握好每一次断键,连键(比如插入等基本操作),以及判断空。这三件事情,就没什么问题了。/** * Definition
2017-03-09 15:15:13
304
原创 leetcode_middle_86_81. Search in Rotated Sorted Array II
题意:将一个升序数组,从中切断,将切断点后面的序列拼接到前面。注:切断点也可能在最后一个数字之后,即数组保持升序不变。注意:数组中可能有重复数字。分析:这个数组长什么样呢? * * * ** *
2017-03-09 14:06:01
196
原创 leetcode_middle_85_33. Search in Rotated Sorted Array
题意:将一个升序数组,从中切断,将切断点后面的序列拼接到前面。注:切断点也可能在最后一个数字之后,即数组保持升序不变。分析:对一个数组的顺序查找,时间是O( n ),想要比这慢,可以,二分查找是O( log n) 但是我们的二分查找是一个顺序数组,但是这是一个 * * **
2017-03-09 13:45:24
242
原创 leetcode_middle_84_103. Binary Tree Zigzag Level Order Traversal
题意:层次遍历二叉树,S型遍历分析:其实就是层次遍历,考虑用队列实现,如何反序呢?考虑用栈实现。至于层次,打个变量标记下就是了。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tree
2017-03-08 22:48:32
217
原创 leetcode_middle_83_200. Number of Islands
题意:一个字符矩阵,1和0构成,问连通的1共有多少块?(连通是指上下左右可达)分析:连通的有多少块 ==》 什么是连通的 ==》 上下左右相邻的1,边界是矩阵的边界或者0 ==》怎么判断:可以用矩阵边界和0作为边界条件,设置四个方向的搜索,自然会将相连的1全部搜索完 ==》 其他块怎么办? ==》 可以讲已经搜索的1设置为0 (这里有一个推论很好想:不同的两块1,一定不相邻
2017-03-08 21:30:37
166
原创 leetcode_middle_82_17. Letter Combinations of a Phone Number
题意:给一个数字字符串。根据手机按键,给出所有可能的对应字符组合。分析:1 用一个map或者数组之类的索引容器将查找信息存储起来2 递归深搜3 每一层是字符串对应数字对应的字符,可以取出当前层遍历数组4 所以需要一个参数index代表哪一层(哪一个字符去展开)基本差不多可以写代码了:public class Solution { privat
2017-03-08 21:09:25
164
原创 leetcode_middle_81_213. House Robber II
题意:给定一个非负整数的数组代表每个房屋里的金额,确定今晚在不偷相邻的两个房屋能抢到的最大金额。最后一个房屋和第一个房屋相邻分析:r如果没有最后一个房屋和第一个房屋相邻的条件,我们知道,前n间房间的最大利润就是:前n-2间的最大利润加上第n间的利润 和 前n-1间的利润的大者。现在因为限制了条件,就必须要分类讨论了,我们用两个动态方程分类讨论,一个是拿第一间,一个是
2017-03-08 20:16:49
242
原创 leetcode_middle_80_201. Bitwise AND of Numbers Range
题意:给定一段区间,返回区间内所有数按位与的结果。分析:本来的思路是处理31位,用数组,对于每一位,全1是1,有0则0,这样需要双重循环,超时public class Solution { public int rangeBitwiseAnd(int m, int n) { int num = 0; int t = 1;
2017-03-08 19:36:39
172
原创 leetcode_middle_79_368. Largest Divisible Subset
题意:给一列数,找出其中最长的一个子序列。使序列中所有的数字两两可整除。分析:随便举个例子分析dp[ i ]1 2 3 9 16 32比如截止9这时候最长的是139,但是到最后最长的是 1 2 16 32所以,说明dp是会更新,且更新的依据遍布1到i-1所以就是:对于dp[ i ] , 遍历1到 i-1。 当nums[ i ]是nums
2017-03-08 15:16:24
211
原创 leetcode_middle_78_117. Populating Next Right Pointers in Each Node II
题意:给一个二叉树,将其next指针设置为其水平右边相邻的那个结点,没有则设置为空分析:the code which i wrote for the 116 still work./** * Definition for binary tree with next pointer. * public class TreeLinkNode { *
2017-03-08 13:27:49
231
原创 leetcode_middle_76_274. H-Index
题意:一个数组,代表一个学者的所有论文。每个数值代表该篇论文的引用次数。找到一个最大的数值h,使该学者有h篇论文至少都被引用h次,其它的所有论文都至多被引用h次。。分析:
2017-03-08 11:24:28
253
原创 leetcode_middle_75_114. Flatten Binary Tree to Linked List
题意:将一个二叉树,按照前序顺序,转化为下图形式。* * * * *分析:由于是前序遍历,深搜即可。比如 dfs(roo.left); dfs(root.right);对于递归:就是我们不管递归深入返回等等过程,只管结果。上面两个递归的结果就是,左子树,右子树各自已经排好。如下:
2017-03-08 10:41:45
143
原创 leetcode_middle_74_90. Subsets II
题意:将一个可能含有重复数的数组的所有子集全部返回。分析:深搜即可,但是不能重复,我们对于重复的不进入递归即可。但是为了判断重复,需要先排序。public class Solution { public List> subsetsWithDup(int[] nums) { List> list = new ArrayList<>();
2017-03-08 10:16:27
171
原创 leetcode_middle_73_80. Remove Duplicates from Sorted Array II
题意:给一个有序数组,对于其中每种数字,如果多于两个,则去除多于两个的部分,并返回新数组的长度。分析:从旧数组到新数组,第一想法就是遍历旧数组(一个指针),生成新数组,一个指针。那么,什么时候新数组的指针移动呢?(即放入新数组)应该是当旧数组的相邻数值不同的时候。一种数字,只有一个:放这个进入新数组一种数字,只有两个:放这两个进入新数组一种数字多于两个,多于的就
2017-03-08 09:45:10
160
原创 leetcode_middle_72_73. Set Matrix Zeroes
题意:给一个矩阵,如果其中有0元素,则将0元素所在的行和列的所有元素都设置为0分析:就集合存起来,下次遍历就好了。这样挺清晰而且简单。时间不多,空间也耗的不多。如果一定要in place,代码势必比较麻烦了,没那必要。public class Solution { public void setZeroes(int[][] matrix) {
2017-03-07 19:42:34
159
原创 leetcode_middle_71_74. Search a 2D Matrix
题意:一个从上到下,从左到右有序的矩阵,要求实现其查找算法。分析:意思不就是有序,明显二分查找。由于是二维数组,首先我们就思考能不能按照一维的方法做(先尝试最良好的实现代码风格),把一个数字转化为坐标,比如求余啥的(再继续思考,发现可以)。我们递归之:public class Solution { int row = 0; int col = 0;
2017-03-07 19:17:28
173
原创 leetcode_middle_70_331. Verify Preorder Serialization of a Binary Tree
题意:给定一个叶子节点只能是#,且#只能是叶子节点的二叉树的前序遍历序列,判断是否符合上述规则。分析:因为不能重构这棵树,判断是否合乎规则,这是栈的重要应用。比如: 6 # 3 # #对于6来说3下面怎样不重要,3的下面必然是两个#,这很好办,但也可能像6一样,
2017-03-07 14:06:59
146
原创 leetcode_middle_69_129. Sum Root to Leaf Numbers
题意:一个只包含0-9的二叉树,如果从根节点到叶子结点的路径上的所有数字(每个结点的数字代表数字的一位)代表一个数字,求这棵树所有数字的和。分析:直接深搜就可以了:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode
2017-03-06 21:28:33
191
原创 leetcode_middle_68_279. Perfect Squares
题意:给定一个数,找出最少多少个平方数(可以重复)之和为这个数。分析:这个题就是一个搜索题,由于是找个数,第一想法就是广度优先搜索。程序正确但是无奈超时。public class Solution { public int numSquares(int n) { //广度优先搜索 int res = 0; Queu
2017-03-06 21:06:27
185
原创 leetcode_middle_67_11. Container With Most Water
题意:数组中的每个数对应一条线段的长度,索引对应x坐标,两个索引可以组成一个底部的宽,高度就是前面所说的线段的长度,而既然是要盛水,高度就是两个线段中较短的一个。给一个非负整数数组,数组的角标代表x轴坐标,角标对应的值代表y轴的值,根据这个点做x轴的垂线,求问那两个点的垂线作为容器的两壁,x轴作为容器底,能装的水最多。分析:
2017-03-06 09:12:02
286
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人