自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 剑指offer 树的子结构

题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)递归root1节点:如果当前的root1对应的树和root2对应的树相等,那么就直接可以返回true,如果不相等,再分别拿root1的左子树和root1的右子树去和root2进行比对,递归判断。public boolean HasSubtree(TreeNode root1,TreeNode...

2019-02-25 21:06:23 224

原创 剑指offer 合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解答思路:这是一道调整引用关系的题目,求解的过程就是判断list1和list2两个头结点哪个小,然后把小的作为合成链表的下一个元素,然后再把它后面的节点做一次递归。递归+建立引用关系:递归:递归体现在拿小的那个节点的下一个节点,作为新的头结点参与递归。建立引用关系:把选出的那个val值...

2019-02-25 20:22:23 158

原创 LeetCode MySQL 例题解析

组合两个表题目:表连接:这题的信息在两张表中,需要有两张表的连接,而Person表明显是主表,它需要显示全部信息,而City还有State这些信息都是对它的补充,所以在表的连接上采用Person表对Address表左连接。既然要连接,那么就需要有一个参数来匹配,那就是PersonId。需要select的信息FirstName,LastName,City,State。SQL查询:se...

2019-02-24 17:28:30 370

原创 437. Path Sum III(路径总和)

题目:两重递归思路:两个递归,一个是遍历出发点的递归,另一个是递归计算从当前节点出发得到sum的路径数。递归出发点:如果当前节点为null,则返回0.如果当前节点非null节点,则计算当前节点是否为所求解并且以它的左子节点和右子节点为root递归该方法。public int pathSum(TreeNode root, int sum) { if(root==nul...

2019-02-23 17:39:06 238

原创 LeetCode 669. Trim a Binary Search Tree(修剪二叉搜索树)

题目:如何去看待修剪这个说法:修剪即去掉那些不在范围内的节点,那么我们是不是可以理解为调整节点之间的引用关系,把这个“修剪”的过程和递归联系起来。**调整引用关系的思路: **递归的节点不满足条件的情况:这是类似于递归查找的部分,如果当前root的值不满足条件,那么就会放弃这个节点的值,若它小于L,就去当前节点的右节点去找,如果它大于R,就去当前节点的左节点去找。当找到一个在范围内的节点...

2019-02-23 13:35:32 200

原创 LeetCode 447. Number of Boomerangs(回旋镖数量)

题目:思路:先确定一个点,然后找到所有到它的距离相等的点,当距离相等的点的数目为2时,有21种,当数目为3时,有32种,于是,如果有n个点,那么可以得到的回旋镖的数目为n*(n-1)。对每个点的判断方法都是一样的,把以所有点为第一个点所能得到的所有回旋镖数目累加,就是总数了。保存到每个点有相同距离的点的数目的方式:使用HashMap完成计数。for(int j=0;j<point...

2019-02-22 14:09:27 183

原创 LeetCode 264. Ugly Number II(丑数II)

题目:思路1(超时):这是最初的思路,因为丑数可以被2和3还有5整除直到为1,所以可以从1开始逐个去找并累加,分别用判断能否被2整除,如果可以就除2,再次重复这样的步骤,直到不能被2整除,再分别拿3和5做同样的事情。最终剩下的是1就说明这是一个丑数,用这样的方式去找第n个就可以了。这种方式很好理解,但是容易超时。因为它做了一些重复的事情,比如每个数都要追溯到不能被2和3还有5整除。思路2(...

2019-02-21 15:26:43 232

原创 LeetCode 279. Perfect Squares(完全平方数)

题目:分析:拿完全平方数凑一个值,这是不是很类似拿硬币凑一个金额的问题,经典的的动态规划题型。一开始我想尝试用递归搜索去求解,但递归的弊端还是很明显,递归几乎等同于枚举,如果能使用动态规划,那么优先使用动态规划,动态规划的时间复杂度几乎是线性的。题目类型很多,但依然脱离不了几个常见的解题模型,在解题前先想想它是属于哪一类题目的,再用相应的方法求解。如何使用动态规划来解决:动态规划的关键是...

2019-02-21 13:18:52 285

原创 LeetCode 204. Count Primes(计数质数)

题目:分析:求解这题如果选择常规的思路去遍历判断每个数是否为质数,即它只能被1和自身整除,时间会超,复杂度O(n^2)。为了优化时间,这题可以使用筛选的方法来实现质数的计算,具体实现是埃拉托斯特尼筛法。埃拉托斯特尼筛法:把大于等于2,小于根号n的那些数的整数倍删除,剩下的就是所要求的范围内的质数。先使用一个boolean的数组来保存每个值是否可取的信息,然后先筛去0和1,把它们赋值为tr...

2019-02-21 12:18:24 212

原创 LeetCode 55. Jump Game(跳跃游戏)

题目:分析:最初我想到的是递归,为什么这题可以用递归呢?因为它的每一步都有相似的地方,比如说它的下一个落子点可以根据当前位置的nums值来得到,递归寻找后续的落子点。当有一个递归方法的传入参数为最后一个位置时,就把标志位设置为true,然后就判断标志位剪枝,没找到就通过递归继续寻找,知道所有的递归方法结束。递归的代码:class Solution { boolean flag=f...

2019-02-20 18:42:33 207

原创 LeetCode 797. All Paths From Source to Target(所有可能的路径)

题目:分析:这题可以通过递归来解决,到了一个新的节点就通过graph数组查找它可以到达的下一个节点然后递归这些节点,在这个过程中不断把遍历到的节点添加到ArrayList中,找到目标节点后,把ArrayList添加到这个ArrayListAll中,ArrayListAll的需要在方法中传递,而ArrayList在递归调用前需要先copy一份,确保每个递归路径持有引用独立的ArrayList。...

2019-02-20 15:27:40 273

原创 Java并发包中并发队列原理剖析

非阻塞队列(ConcurrentLinkedQueue)**介绍:**这是一种无界的非阻塞队列,它的底层数据结构是通过单向链表实现的,只可以在队尾通过CAS算法添加元素,或者是在队尾通过CAS算法移除元素,它是一种线程安全的队列。1.offer操作:offer操作是指通过CAS算法在队列末尾添加元素,checkNotNull(e)方法检测添加的元素是否为空,如果是空则会抛出异常。然后定义一个新...

2019-02-20 01:03:50 419

原创 LeetCode 787. Cheapest Flights Within K Stops(K站中转内最便宜的航班)

题目:分析:这题的思路是用递归来求解,因为每一步的判断都是类似的,比如找到下一个可以去的地方,然后把总价加上航班价格再把转站次数减一,递归,把这些修改后的参数作为新的参数。这题也有“剪枝”的思想,当总价大于当前更新的最小总价,那么就结束该方向的递归;或者是当前可转站次数为0,搜寻可直接到达的站点是否有目标站点,如果没有,则结束递归,如果有,就尝试更新最小总价。解题过程:特殊情况处理。i...

2019-02-19 17:28:01 327

原创 LeetCode 347. 前K个高频元素 692.前K个高频单词

题目:分析:这题要求从所给数组中筛选出出现频率前k高的元素,因此需要统计每个数出现的次数,使用HashMap记录数据和它们出现的频次,读到的数如果在Map中不存在,则添加到Map中并记录频次为1,一旦第二次读到,就把计数加一。HashMap<Integer, Integer> map=new HashMap<>(); for(int i=0;i&lt...

2019-02-19 16:58:13 164

原创 LeetCode 227. Basic Calculator II(基本计算器)

题目:解析:这题的解决思路是模拟运算过程,从左到右,读取数字和字符,做到累加,关键是如何解决遇到的乘号或者除号的问题,因为在遇到他们之前那个数字已经被累加或者减去了,此时需要减掉多加的部分(这个数可能是正值也可能是负值)。需要保存的值有:最后一次读到的符号、最后一个读到的符号的左右两个数、累计总和。最后还需要考虑末尾数字的累加问题。过程分析:刚开始默认sign为“+”,读到数字就把之前的...

2019-02-19 02:46:58 195

原创 Java并发包中的锁原理剖析

LockSupport工具类LockSupport是JUC并发包下的一个工具类,它的底层是由Unsafe类实现的,它是基于Unsafe类的park()和unpark()方法包装并扩展功能实现的一个工具类,它主要用于对线程的挂起和唤醒操作,它是线程安全的,底层由CAS算法实现。通过它的名字我们也可以知道,它是锁的支持类,后面的锁的实现都是基于它实现的。LockSupport的park()方法:...

2019-02-15 03:15:46 598

原创 738. Monotone Increasing Digits(单调递增的数字)

** 题目**分析:首先分析题目给出的条件,输出的数不能大于输入的数,且输出的数的各个位数单调递增的。解决这类条件限定题目,可以有两种思路:在位数等确定的情况下可以使用for循环以及if else进行筛选和判断。在位数不确定的情况下,一般通过对原数组的遍历修改,达到目标。这两种情况都需要对条件充分认识,后者会更加趋向于对规律的判断。我们选择第二种方法,输入的位数是不确定的,输出的位数...

2019-02-14 13:36:22 278

原创 Java并发包中的List源码剖析

CopyOnWriteArrayList(写时复制ArrayList)写时复制:这是JUC并发包下的基于写时复制的ArrayList。为什么是写时复制呢?因为当调用对这个ArrayList中的元素进行修改的方法时,会先复制一个原数组的副本,对这个副本进行操作,最后再让原数组的引用指向这个新的数组,实现数据的更新,这个过程的原子性通过独占锁来保证,这就是写时复制。它归类于并发包的原因是,对这个类的...

2019-02-14 00:26:30 1046

原创 LeetCode 105. 从前序与中序遍历序列构造二叉树、106. 从中序与后序遍历序列构造二叉树

题目分析:一般我们是通过递归,由已知的二叉树获取遍历的序列,这题的要求和以往相反,需要我们通过前序和中序遍历的序列构造出二叉树。基本思路是递归来实现建树,关键是找到不同当前root节点与下一层节点的关系,如何得到两个子树的前序和中序遍历然后递归这个方法,其中还要实现root节点与其左子节点和右子节点的连接。第一次调用该方法new一个根节点,调用左右子树的该方法分别返回一个左子节点和右子节点的...

2019-02-13 15:41:41 325

原创 LeetCode 110.平衡二叉树、865. 具有所有最深结点的最小子树

判断平衡二叉树题目:分析:二叉树的题目一般选择递归求解,通过判断原式的返回值和入口参数,发现这里原式就可以拿来递归。这题的关键是找到当前树和子树的关于平衡二叉树判断的联系。把求当前树平衡转移到对子树的平衡判断中。比如先是判断以根节点为代表的树是否为配合二叉树,递推关系是:它的左子树和右子树都分别需要是平衡二叉树,然后左子树的深度和右子树的深度相差小于2。这样就把判断转移到了子树,最后好需要实...

2019-02-13 11:35:33 340

原创 LeetCode 695.岛屿的最大面积、200. 岛屿的个数、130. 被围绕的区域(递归求解)

岛屿的最大面积题目:DFS(深度优先搜索):假设刚开始所有节点都是没有访问过的,从某一节点出发,先标记它为已访问,然后以它为中心向四周去寻找新的没有访问过的节点,以此类推,直到所有点都被访问完。解题思路:采用递归的思想,遍历每一个为1的节点。把当前节点标为0,从它出发访问周围为1的节点,以此类推。递归的方法需要有返回值,每访问一个节点,返回值累加1,最终初始调用处会得到一个“岛屿的面积”,...

2019-02-11 22:00:22 465

原创 LeetCode 62.63. Unique Paths(不同路径)

Unique Paths(不同路径)题目解析思路:拿到这个题目有两种思路,递归和动归。下面分析两种方法的选择理由和可行性。递归:递归一般用于处理题目中有重复出现的选择和判断的情况,可以套用相同的方法来解决。递归的优点是可以应对各种输入的变化,实现完全的枚举以及剪枝操作。但是当情况复杂的时候,可能会申请过多的空间造成超时或者空间不足,在空间使用很大的情况下也会影响到时间的。在这题可以用递归...

2019-02-10 12:37:07 228

原创 LeetCode 39.40. Combination Sum(组合总和)

题目解析思路:这是一道在选择数字的题,条件是数字和为目标值。数字可以被重复选择,集合不能包含重复组合。假设我们从其中选取了一个数a,那么下一个数字依然可以从所有的数字中取选择,新的目标值改变为target-a。接下来的每一步都是一样,都可以用相同的公式去迭代,如果在方法进入后发现传入的target值小于0了,那么就“剪枝”。如果target值正好等于0,那么这就是我们要的组合,在递归的过程中...

2019-02-10 11:41:52 230

原创 LeetCode 22. Generate Parentheses(括号生成)

题目解析思路:一开始我的思路是如何去对所有可能的情况进行遍历,最后再根据合理性排除掉不可能的解。输入的n为如何值都有可能,我没有办法通过循环去尝试组合。这里用到的是“(”和“)”两种符号,就像是0和1一样,这让我联想到了二叉树的遍历,二叉树的遍历是以递归的形式实现的,最终它可以遍历到每一个节点并且可以得到每个节点的唯一的01码(假设向左遍历字符串累加0,向右遍历字符串累加1)。这道题不也是对...

2019-02-09 19:42:20 214

原创 Java并发包中原子操作类原理剖析

JUC包中的类是为解决高并发而设计的类,其中包括原子操作类,这些类的底层都是基于Unsafe类的方法实现的,JUC包中的原子操作类包括AtomicInteger、AtomicIong、AtomicBoolean等原子操作类,它们的功能和Integer、Long、Boolean类似,只是这些原子操作类的底层由Unsafe类的方法实现,是原子性操作,满足高并发的要求,在多线程下,使用这些原子操作类会比较可靠。这些原子操作类通过CAS实现在高并发下代替synchronize实现更高的效率,下面我们来具体地分析

2019-02-09 18:34:38 418

原创 Java Unsafe类的使用

Unsafe类的作用Unsafe类是rt.jar包中的类,它提供了原子级别的操作,它的方法都是native方法,通过JNI访问本地的C++库。它的出现是为了解决在高并发下的数据同步问题。synchronize关键字修饰的代码块被加了独占锁,相同时间只能有一个线程访问其中的内容,在高并发下这必然会导致大量线程挂起,从用户态转为内核态,带来很大的消耗而且操作效率低下。CAS算法的出现使得在不使用sy...

2019-02-09 11:04:20 3391

原创 LeetCode Best Time to Buy and Sell Stock 购买股票的最佳时机(题解合集、动态规划)

一笔交易,求最佳利润题目:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 ...

2019-02-08 17:32:09 240

原创 LeetCode 763. Partition Labels(划分字母区间)

题目解析分析:题目的要求是把原字符串划分为若干子串,原字符串中出现的字符只会出现在其中一个子串中,子串尽可能划分地多。思路1:这是我最初的一个想法,写一个内部类Range,它有start和end两个属性,遍历一边字符串,把每个英文字符及其Range保存在HashMap中;然后写一个数组保存断点信息,对每个可断的点进行判断,如果它在某个Range范围内,那么它是不能作为断点的,因为它会导致一...

2019-02-08 10:23:46 228

原创 LeetCode 56. Merge Intervals(合并区间)

题目解析分析:这题给出一个区间,但是并不一定是有序区间,于是想到需要对区间进行排序,可以通过区间的start来排序;合并重叠只要拿下一个区间的start和end去和上一个区间的end来比较,可能有三种情况:1、下一个区间完全包含在上一个区间中,那么下一个区间就不需要考虑了。2、下一个区间和上一个区间部分重叠,此时需要修改上一个区间的end。3、下一个区间和上一个区间无重叠,直接把该新区...

2019-02-07 20:38:11 330

原创 LeetCode 622. Design Circular Queue(设计循环队列)

题目要求设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCi...

2019-02-07 18:49:47 355

原创 LeetCode 107. Binary Tree Level Order Traversal II(二叉树的层次遍历)

题目解析分析:这题需要访问到每个元素,然后还需要按照层次来输出一个List的两重嵌套。我想到的方法是用递归,对二叉树先根遍历,递归可以较快地不重复地访问每个元素,同时可以通过一个level参数来标记不同的层次,以便把数据分拣到不同的List。用ArrayList来保存数据,在递归的时候会根据访问的深度为第一层的List添加子List,然后根据深度,获取子List,分配val值。因为低层的Li...

2019-02-06 17:32:19 162

原创 LeetCode 949. Largest Time for Given Digits(给定数字能组成的最大时间)

题目解析分析:给定四个数,用其中两个数组成小时,剩下两个数组成分钟,小时有范围限制,分钟也有范围限制,数字也不能重复,另外需要让时间的表示尽可能的大。在这多重的限制下,只是用if语句是无法考虑到所有条件的,最好的方式就是for循环嵌套,进行多重约束。最外层的循环先满足小时的要求,且从大往小考虑,内层循环再考虑分钟,也从大往小考虑,当满足所有要求之后,就构造得到字符串。如果在遍历了所有可能后都...

2019-02-06 11:30:00 300

原创 LeetCode 148. Sort List(排序链表)

题目求解分析:题目要求时间复杂度是O(nlogn),我想到的是可以使用快排,但是数据是存在链表中的,我们只有第一个节点的引用,需要遍历链表,取出数据并排序,对原链表数据按照排序结果赋值,最后返回头结点。过程:1、保存头结点,取出数据保存在数组中。 ListNode firstNode=head; if(head==null) return null; ...

2019-02-05 19:24:54 281

原创 基于UDP编写协议实现可靠传输

面向无连接的UDPUDP是一种面向无连接的传输协议,可以理解为对某个地址寄一封信,只要双方地址填对,信就可以成功送出去,但对方能不能收到这份信,那就不一定了,可能信在传输的过程中丢了,也有可能接收方没有去查收它。总之,UDP不可靠。那么什么是可靠的呢?TCP,TCP是一种面向连接的通信协议,它在建立连接前会通过三次握手来确认双方都可以正确接收信息,面向连接的通信方式可以理解为打电话的过程,只有双...

2019-02-05 10:56:48 8219 4

原创 LeetCode 764. Largest Plus Sign(最大加号标志)

题目在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1。网格中包含 1 的最大的轴对齐加号标志是多少阶?返回加号标志的阶数。如果未找到加号标志,则返回 0。一个 k" 阶由 1 组成的“轴对称”加号标志具有中心网格 grid[x][y] = 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1...

2019-02-04 15:28:42 423

原创 LeetCode 41. First Missing Positive(缺失的第一个正数)

题目题目补充说明:这题中输入的数据中可以有负值,可以有重复的值,其中真正需要的排序效果是1,2,3,4…n这样的效果,让在这些数据之间找到缺失的第一个正数。解析分析:在明确了题目的实际要求之后,就可以设计算法了,比如如何处理负数和重复的数据,如何满足题目对于时间复杂度和空间复杂度的要求,时间复杂度要求只能遍历一遍,空间复杂的决定了算法中只能使用常数变量而不能使用HashMap。于是我的思路...

2019-02-04 14:01:00 230

原创 对称加密、非对称加密、DH协定、数字证书、SSL实现安全通信

为什么要加密当数据从一个ip到另一个ip的过程中,往往是需要经过很多的ip才能到达目标ip,这个过程可以通过tracert命令来查看,比如,输入一个淘宝的网址,跟踪它的路由,如下:我们可以发现,这个过程经过了很多的ip,我们不知道这些ip是谁的主机,只知道我们的数据经过了它们。数据的传输是以字节的形式的,如果不加密,这些数据可以轻易人获取并得到内部的信息,因此这种明文传输的方式是不安全的。一...

2019-02-03 23:56:40 934

原创 LeetCode 190.Reverse Bits(颠倒二进制位)

题目求解思路:我采用的IDE是Java,在Java中二进制转为int是对二进制求补码(在Java中都是有符号数),同理int转byte就是补码的逆运算,例如8位的二进制的范围就是-128~127,如果对字节的赋值超过这个范围编译器就会报错。在计算机中一个int值是保存在32个位中的(也就是四个字节),因此例如-3这个数对应的存储单元为11111111111111111111111111111...

2019-02-03 11:41:36 214

原创 LeetCode 7. Reverse Integer(整数反转)

题目分析最初的想法:一开始打算把原数字分解,分解出它的符号,再分解出它的每一位保存在数组中,然后合成需要的数值。但是这有一个问题,需要考虑溢出,在计算的过程中会出现溢出而和预期的结果不一致的情况。且因为是拆分的合并,在计算的过程中多次加if语句来判断参数范围,算法很低效,也很容易出错。如何优化算法:为了解决计算公式复杂的问题,接下来我试着去掉数组,在一个循环中累加新值,把运算的过程放在一个...

2019-02-03 10:58:38 146

原创 设计模式之MVC

什么是MVCMVC三个单词分别是model(模型)、view(视图)、control(控制),MVC设计模式的特点就是把模型、视图、控制三个部分的代码分开写,使得各个部分最大限度地实现松耦合,视图部分持有模型部分和控制部分的引用,控制部分持有视图部分和模型部分的引用,而模型部分不持有它们的引用。如果要实现模型对视图的影响,可以使用观察者模式,在模型中注册视图的观察者对象,当有信息更新的时候可以通...

2019-02-02 23:18:47 398

空空如也

空空如也

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

TA关注的人

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