<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Daniel_2046的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Daniel_2046</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Daniel_2046]]></copyright><item><title><![CDATA[二叉树的先序、中序、后序序列的转化]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81335025</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81335025</guid><author>Daniel_2046</author><pubDate>Wed, 01 Aug 2018 18:27:04 +0800</pubDate><description><![CDATA[问题

已知二叉树的先序序列pre和中序序列in，求后序序列post。

分析

 

先序序列的结构是：根 + 左子树的先序序列 + 右子树的先序序列

中序序列的结构是：左子树的中序序列 + 根 + 右子树的中序序列

后续序列的结构是：左子树的后序序列 + 右子树的后序序列 + 根

如图所示





现在只看先序和中序序列，对于每一个二叉树，都可以划分成这样的形式。这时候得到了左右子树的...]]></description><category></category></item><item><title><![CDATA[[PAT] Perfect Sequence]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81333188</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81333188</guid><author>Daniel_2046</author><pubDate>Wed, 01 Aug 2018 16:30:41 +0800</pubDate><description><![CDATA[题目

Given a sequence of positive integers and another positive integer p. The sequence is said to be a &quot;perfect sequence&quot; if M &amp;lt;= m * p where M and m are the maximum and minimum numbers in the sequ...]]></description><category></category></item><item><title><![CDATA[统计完全二叉树的节点数]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81161142</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81161142</guid><author>Daniel_2046</author><pubDate>Mon, 23 Jul 2018 01:03:11 +0800</pubDate><description><![CDATA[ 

目录

问题

分析

代码

复杂度

问题

给定一个完全二叉树，统计其中的节点数，要求时间复杂度低于O(n)

分析

        统计一个二叉树的节点最简单的方法当然是遍历一次，但是这样的时间复杂度是严格的O(n)，不满足要求。要更快，自然要在完全二叉树的性质上下功夫。

        完全二叉树的最后一层，节点一定是从左向右紧密排列的。由此可以想到什么？完全二叉树里一定有满的...]]></description><category></category></item><item><title><![CDATA[[LeetCode] Generate Parentheses]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81153468</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81153468</guid><author>Daniel_2046</author><pubDate>Sun, 22 Jul 2018 12:28:06 +0800</pubDate><description><![CDATA[目录

 

问题

分析

代码

问题

给出 n 代表生成括号的对数，请你写出一个函数，使其能够生成所有可能的并且有效的括号组合。

例如，给出 n = 3，生成结果为：


[
  &quot;((()))&quot;,
  &quot;(()())&quot;,
  &quot;(())()&quot;,
  &quot;()(())&quot;,
  &quot;()()()&quot;
]


分析

关于括号的问题最简单的方法就是用一个辅助栈，使用辅助栈，实际上得到的信息是什么？...]]></description><category></category></item><item><title><![CDATA[[LeetCode] Remove Nth Node From End of List]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81153337</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81153337</guid><author>Daniel_2046</author><pubDate>Sun, 22 Jul 2018 12:08:12 +0800</pubDate><description><![CDATA[目录

问题

分析

代码

问题

    给定一个链表，删除链表的倒数第 n 个节点，并且返回链表的头结点。

示例：


给定一个链表: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5, 和 n = 2.

当删除了倒数第二个节点后，链表变为 1-&amp;gt;2-&amp;gt;3-&amp;gt;5.


说明：

    给定的 n 保证是有效的。

进阶：    

    你能尝试使用一趟扫描实现...]]></description><category></category></item><item><title><![CDATA[串匹配问题与KMP算法]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81144979</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81144979</guid><author>Daniel_2046</author><pubDate>Sat, 21 Jul 2018 17:25:22 +0800</pubDate><description><![CDATA[目录

问题

蛮力算法

KMP算法-主算法

KMP算法-生成next表

KMP算法-复杂度分析

KMP算法-next表改进

问题

在现实中经常遇到这样的需求：

    给一个较长的串T，长n，和一个较短的串P，长m，设计算法判断P中是否包含T，若有，返回T中和P匹配的子串起点的下标。

蛮力算法

最容易想到的就是两个串头部对齐，两个指针i、j表示T和P中进行匹配的元素的下标（初始...]]></description><category></category></item><item><title><![CDATA[判断单链表是否存在环，两个单链表是否相交]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81043024</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81043024</guid><author>Daniel_2046</author><pubDate>Wed, 18 Jul 2018 13:15:38 +0800</pubDate><description><![CDATA[给出一个单链表，节点结构如下


public class Node{
	int value;
	Node next;
}

要求：判断链表是否有环。若有环，返回入环的第一个节点；若无环，返回null。

    快慢指针是链表问题中常用的方法，一个快指针一次走两步，一个慢指针一次走一步。这里利用双指针判断是否有环。无环的情况很简单，fast走得快，如果它遇到null就是无环的。注意判断next和...]]></description><category></category></item><item><title><![CDATA[二叉树的遍历（递归和迭代版）]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/81008302</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/81008302</guid><author>Daniel_2046</author><pubDate>Thu, 12 Jul 2018 15:30:52 +0800</pubDate><description><![CDATA[二叉树常见的遍历方式有先序遍历、中序遍历、后序遍历、层次遍历。

首先介绍前三种遍历方式，对于每一个子树，遍历的顺序是

    先序遍历：根      -&amp;gt;左子树-&amp;gt;右子树    ，如图中①

    中序遍历：左子树-&amp;gt;根      -&amp;gt;右子树    ，如图中②

    后序遍历：左子树-&amp;gt;右子树-&amp;gt;根          ，如图中③



先序遍历：

 ...]]></description><category></category></item><item><title><![CDATA[[PAT] Maximal Clique]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80964060</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80964060</guid><author>Daniel_2046</author><pubDate>Sun, 08 Jul 2018 23:41:03 +0800</pubDate><description><![CDATA[题目如下1142 Maximal Clique（25 分）A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be exten...]]></description><category></category></item><item><title><![CDATA[[PAT] Topological Order 判断拓扑序列]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80963825</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80963825</guid><author>Daniel_2046</author><pubDate>Sun, 08 Jul 2018 23:13:20 +0800</pubDate><description><![CDATA[题目在这，我就不翻译了。。。1146 Topological Order（25 分）This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topological order obtained from the given directed graph? Now y...]]></description><category></category></item><item><title><![CDATA[[PAT] Heap 判断大小根堆]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80963737</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80963737</guid><author>Daniel_2046</author><pubDate>Sun, 08 Jul 2018 22:54:36 +0800</pubDate><description><![CDATA[题目如下：1147 Heaps（30 分）In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if P is a parent node of C, then the key (the value) of P is either greate...]]></description><category></category></item><item><title><![CDATA[git reset soft,hard,mixed之区别深解]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80920907</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80920907</guid><author>Daniel_2046</author><pubDate>Thu, 05 Jul 2018 01:33:20 +0800</pubDate><description><![CDATA[GIT reset命令，似乎让人很迷惑，以至于误解，误用。但是事实上不应该如此难以理解，只要你理解到这个命令究竟在干什么。首先我们来看几个术语HEAD这是当前分支版本顶端的别名，也就是在当前分支你最近的一个提交Indexindex也被称为staging area，是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commitWorking Copyworking copy代表你...]]></description><category></category></item><item><title><![CDATA[Java类加载机制：加载的时机]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80817710</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80817710</guid><author>Daniel_2046</author><pubDate>Tue, 26 Jun 2018 17:44:54 +0800</pubDate><description><![CDATA[    Java类的加载机制与C语言不同。C语言在在编译器进行连接工作，而在Java中，类的加载、连接和初始化工作都是在程序运行期间完成的。这种策略虽然在类加载时稍微增加了性能开销，却未Java程序提供了高度的灵活性。Java天生可以动态扩展的语言特性就得益于这一点。类加载的时机   类的生命周期包括：加载、验证、准备、解析、初始化、使用和卸载。其中验证、准备、解析三个部分统称连接（Linking...]]></description><category></category></item><item><title><![CDATA[[转载] JDK8-废弃永久代（PermGen）迎来元空间（Metaspace）]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80795486</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80795486</guid><author>Daniel_2046</author><pubDate>Sun, 24 Jun 2018 22:41:17 +0800</pubDate><description><![CDATA[在书上甚至网上很多博客上的JVM知识里都会提到永久代，但实际上Java8已经移除了永久代，看到这篇文章，解决关于永久代移除的疑问。1.背景2.为什么废弃永久代（PermGen）3.深入理解元空间（Metaspace）4.总结========正文分割线=====一、背景1.1 永久代（PermGen）在哪里？根据，hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了)：上图引自网络，但有个问...]]></description><category></category></item><item><title><![CDATA[JVM内存分配策略]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80794511</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80794511</guid><author>Daniel_2046</author><pubDate>Sun, 24 Jun 2018 22:30:41 +0800</pubDate><description><![CDATA[    对象的内存分配，主要是分配在新生代的Eden区上，如果启动了本地线程分配缓冲，就按线程优先在TLAB上分配，如果TLAB不够用，再分配在Eden上，如果Eden上也不够用，就分配在老年代中。分配规则的细节取决于垃圾收集器组合和虚拟机与内存相关的参数的配置。对象优先在Eden上分配     大多数情况下，对象在Eden上分配。    如果Eden上空间不够，VM会发起一次新生代GC（Mino...]]></description><category></category></item><item><title><![CDATA[HotSpot中的OopMap、Safe Point和Safe Region]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80786801</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80786801</guid><author>Daniel_2046</author><pubDate>Sat, 23 Jun 2018 21:13:42 +0800</pubDate><description><![CDATA[1.OopMap    在正式的GC之前，要进行可达性分析来标记出将来可能要宣告死亡的对象。如果每次GC的时候都要遍历所有的引用，这样的工作量是非常大的。因为在可达性分析的时候要保证期间不发生引用关系的变化，所有执行线程要停顿等待，称为“Stop The World”，程序中的线程需要停止来配合可达性分析。    所以，每次直接遍历整个引用链肯定是不现实的。 为了应对这种尴尬的问题，最早有保守式G...]]></description><category></category></item><item><title><![CDATA[有序矩阵查找问题]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80784973</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80784973</guid><author>Daniel_2046</author><pubDate>Sat, 23 Jun 2018 17:29:26 +0800</pubDate><description><![CDATA[    给一个行和列都排好序的n*m矩阵，判断一个数是否存在于矩阵中，要求时间复杂度O(n+m)，空间复杂度O(1)。    遍历肯定太慢了，看到在矩阵中找，就联想到利用有序矩阵的性质一次否决掉一批元素。因为行和列都是有序的，所以对于矩阵中的每一个元素，同一行左面/同一列上面所有的元素都小于等于它，同一列下面/同一行右面所有的元素都大于等于它，所以每次把一个元素x和给定值a进行比较，都可以否决掉x...]]></description><category></category></item><item><title><![CDATA[Spiral Matrix 问题]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80783684</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80783684</guid><author>Daniel_2046</author><pubDate>Sat, 23 Jun 2018 15:08:33 +0800</pubDate><description><![CDATA[    这种问题很容易陷入怎么在局部转向的误区，更好的方法还是用逐步缩小问题规模的思路，每次解决一对左上右下坐标(lr,lc)(rr,rc)确定的一圈，一圈一圈往里走，直到把整个矩阵走完。对于每个边长L的圈，每次打印（L-1）长度转向，打印四次。    注意一下边界情况，两个坐标可能在一行或一列，这时候直接向右打印一行或向下打印一列就可以了。	public void printFrame(int[...]]></description><category></category></item><item><title><![CDATA[Java的GC]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80758694</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80758694</guid><author>Daniel_2046</author><pubDate>Thu, 21 Jun 2018 14:25:17 +0800</pubDate><description><![CDATA[    垃圾收集简称GC。在C/C++中，如果一个变量不再使用，需要程序员手动释放相应的内存，当程序很长，变量很多的时候，这种操作就变得非常繁琐，容易出错。从开发的角度看，程序员也不应该在内存分配释放这样的事情上消耗太多精力。于是有了GC。where？    程序计数器、虚拟机栈、本地方法栈是线程私有的，随线程创建和消亡，栈帧的大小在类结构确定下来时已经确定，这些部分内存的分配和回收具备确定性。而...]]></description><category></category></item><item><title><![CDATA[[LeetCode] Container With Most Water]]></title><link>https://blog.youkuaiyun.com/Daniel_2046/article/details/80684547</link><guid>https://blog.youkuaiyun.com/Daniel_2046/article/details/80684547</guid><author>Daniel_2046</author><pubDate>Wed, 13 Jun 2018 20:54:59 +0800</pubDate><description><![CDATA[    当然可以用O(n^2)的方法暴力求解，但是题目出出来肯定不是让我们暴力求解的。首先想到的是设计一个算法让问题规模不断缩小，这里在求解过程中的变化应该是单向的——比如让底边不断缩短。    我们可以用双指针法，让左右指针向中间移动遍历数组，在这期间每次移动指针底边都缩短1，这时候的问题是，按照什么规则遍历？在这里，每次向内移动的指针只能是较短边的那一个。    证明：容器的储水量V0是较短边...]]></description><category></category></item></channel></rss>