- 博客(29)
- 收藏
- 关注
原创 二叉树的先序、中序、后序序列的转化
问题已知二叉树的先序序列pre和中序序列in,求后序序列post。分析 先序序列的结构是:根 + 左子树的先序序列 + 右子树的先序序列中序序列的结构是:左子树的中序序列 + 根 + 右子树的中序序列后续序列的结构是:左子树的后序序列 + 右子树的后序序列 + 根如图所示现在只看先序和中序序列,对于每一个二叉树,都可以划分成这样的形式。这时候得到了左右子树的...
2018-08-01 18:27:04 6536
原创 [PAT] Perfect Sequence
题目Given a sequence of positive integers and another positive integer p. The sequence is said to be a "perfect sequence" if M <= m * p where M and m are the maximum and minimum numbers in the sequ...
2018-08-01 16:30:41 257
原创 统计完全二叉树的节点数
目录问题分析代码复杂度问题给定一个完全二叉树,统计其中的节点数,要求时间复杂度低于O(n)分析 统计一个二叉树的节点最简单的方法当然是遍历一次,但是这样的时间复杂度是严格的O(n),不满足要求。要更快,自然要在完全二叉树的性质上下功夫。 完全二叉树的最后一层,节点一定是从左向右紧密排列的。由此可以想到什么?完全二叉树里一定有满的...
2018-07-23 01:03:11 2976
原创 [LeetCode] Generate Parentheses
目录 问题分析代码问题给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]分析关于括号的问题最简单的方法就是用一个辅助栈,使用辅助栈,实际上得到的信息是什么?...
2018-07-22 12:28:06 250
原创 [LeetCode] Remove Nth Node From End of List
目录问题分析代码问题 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明: 给定的 n 保证是有效的。进阶: 你能尝试使用一趟扫描实现...
2018-07-22 12:08:12 179
原创 串匹配问题与KMP算法
目录问题蛮力算法KMP算法-主算法KMP算法-生成next表KMP算法-复杂度分析KMP算法-next表改进问题在现实中经常遇到这样的需求: 给一个较长的串T,长n,和一个较短的串P,长m,设计算法判断P中是否包含T,若有,返回T中和P匹配的子串起点的下标。蛮力算法最容易想到的就是两个串头部对齐,两个指针i、j表示T和P中进行匹配的元素的下标(初始...
2018-07-21 17:25:22 589
原创 判断单链表是否存在环,两个单链表是否相交
给出一个单链表,节点结构如下public class Node{ int value; Node next;}要求:判断链表是否有环。若有环,返回入环的第一个节点;若无环,返回null。 快慢指针是链表问题中常用的方法,一个快指针一次走两步,一个慢指针一次走一步。这里利用双指针判断是否有环。无环的情况很简单,fast走得快,如果它遇到null就是无环的。注意判断next和...
2018-07-18 13:15:38 649
原创 二叉树的遍历(递归和迭代版)
二叉树常见的遍历方式有先序遍历、中序遍历、后序遍历、层次遍历。首先介绍前三种遍历方式,对于每一个子树,遍历的顺序是 先序遍历:根 ->左子树->右子树 ,如图中① 中序遍历:左子树->根 ->右子树 ,如图中② 后序遍历:左子树->右子树->根 ,如图中③先序遍历: ...
2018-07-12 15:30:52 684
原创 [PAT] Maximal Clique
题目如下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...
2018-07-08 23:41:03 224
原创 [PAT] Topological Order 判断拓扑序列
题目在这,我就不翻译了。。。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...
2018-07-08 23:13:20 690
原创 [PAT] Heap 判断大小根堆
题目如下: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...
2018-07-08 22:54:36 1847 1
转载 git reset soft,hard,mixed之区别深解
GIT reset命令,似乎让人很迷惑,以至于误解,误用。但是事实上不应该如此难以理解,只要你理解到这个命令究竟在干什么。首先我们来看几个术语HEAD这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交Indexindex也被称为staging area,是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commitWorking Copyworking copy代表你...
2018-07-05 01:33:20 220
原创 Java类加载机制:加载的时机
Java类的加载机制与C语言不同。C语言在在编译器进行连接工作,而在Java中,类的加载、连接和初始化工作都是在程序运行期间完成的。这种策略虽然在类加载时稍微增加了性能开销,却未Java程序提供了高度的灵活性。Java天生可以动态扩展的语言特性就得益于这一点。类加载的时机 类的生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。其中验证、准备、解析三个部分统称连接(Linking...
2018-06-26 17:44:54 204
转载 [转载] JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
在书上甚至网上很多博客上的JVM知识里都会提到永久代,但实际上Java8已经移除了永久代,看到这篇文章,解决关于永久代移除的疑问。1.背景2.为什么废弃永久代(PermGen)3.深入理解元空间(Metaspace)4.总结========正文分割线=====一、背景1.1 永久代(PermGen)在哪里?根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了):上图引自网络,但有个问...
2018-06-24 22:41:17 211
原创 JVM内存分配策略
对象的内存分配,主要是分配在新生代的Eden区上,如果启动了本地线程分配缓冲,就按线程优先在TLAB上分配,如果TLAB不够用,再分配在Eden上,如果Eden上也不够用,就分配在老年代中。分配规则的细节取决于垃圾收集器组合和虚拟机与内存相关的参数的配置。对象优先在Eden上分配 大多数情况下,对象在Eden上分配。 如果Eden上空间不够,VM会发起一次新生代GC(Mino...
2018-06-24 22:30:41 241
原创 HotSpot中的OopMap、Safe Point和Safe Region
1.OopMap 在正式的GC之前,要进行可达性分析来标记出将来可能要宣告死亡的对象。如果每次GC的时候都要遍历所有的引用,这样的工作量是非常大的。因为在可达性分析的时候要保证期间不发生引用关系的变化,所有执行线程要停顿等待,称为“Stop The World”,程序中的线程需要停止来配合可达性分析。 所以,每次直接遍历整个引用链肯定是不现实的。 为了应对这种尴尬的问题,最早有保守式G...
2018-06-23 21:13:42 5172
原创 有序矩阵查找问题
给一个行和列都排好序的n*m矩阵,判断一个数是否存在于矩阵中,要求时间复杂度O(n+m),空间复杂度O(1)。 遍历肯定太慢了,看到在矩阵中找,就联想到利用有序矩阵的性质一次否决掉一批元素。因为行和列都是有序的,所以对于矩阵中的每一个元素,同一行左面/同一列上面所有的元素都小于等于它,同一列下面/同一行右面所有的元素都大于等于它,所以每次把一个元素x和给定值a进行比较,都可以否决掉x...
2018-06-23 17:29:26 1236
原创 Spiral Matrix 问题
这种问题很容易陷入怎么在局部转向的误区,更好的方法还是用逐步缩小问题规模的思路,每次解决一对左上右下坐标(lr,lc)(rr,rc)确定的一圈,一圈一圈往里走,直到把整个矩阵走完。对于每个边长L的圈,每次打印(L-1)长度转向,打印四次。 注意一下边界情况,两个坐标可能在一行或一列,这时候直接向右打印一行或向下打印一列就可以了。 public void printFrame(int[...
2018-06-23 15:08:33 238
原创 Java的GC
垃圾收集简称GC。在C/C++中,如果一个变量不再使用,需要程序员手动释放相应的内存,当程序很长,变量很多的时候,这种操作就变得非常繁琐,容易出错。从开发的角度看,程序员也不应该在内存分配释放这样的事情上消耗太多精力。于是有了GC。where? 程序计数器、虚拟机栈、本地方法栈是线程私有的,随线程创建和消亡,栈帧的大小在类结构确定下来时已经确定,这些部分内存的分配和回收具备确定性。而...
2018-06-21 14:25:17 218
原创 [LeetCode] Container With Most Water
当然可以用O(n^2)的方法暴力求解,但是题目出出来肯定不是让我们暴力求解的。首先想到的是设计一个算法让问题规模不断缩小,这里在求解过程中的变化应该是单向的——比如让底边不断缩短。 我们可以用双指针法,让左右指针向中间移动遍历数组,在这期间每次移动指针底边都缩短1,这时候的问题是,按照什么规则遍历?在这里,每次向内移动的指针只能是较短边的那一个。 证明:容器的储水量V0是较短边...
2018-06-13 20:54:59 158
原创 关于快速排序
快速排序是基于partition过程的排序方法,时间复杂度O(nlogn),是几种O(logn)的排序算法中常系数最小的。 partition顾名思义是划分。选定一个元素a,把所有小于等于a的元素放到a的左边,大于a的元素放到a的右边,这里a左边和右边的区域不需要有序。 经典快速排序算法是每次选定最末尾的元素x,partition之后,x左边的元素都小于等于x,右边的元素都大于...
2018-06-13 16:03:52 217
原创 对象的内存布局
在HotSpot虚拟机中,对象在内存中的布局分为三块:对象头、示例数据、对齐填充。1.对象头 包括两部分:Mark Word、类型指针、数组长度(if 数组对象) (1)Mark Word:存储对象自身的运行时数据(哈希码、GC年龄、锁标志、持有的锁等)。被设计成非固定数据结构,根据对象状态服用内部空间。 (2)类型指针:对象指向它的类元数据的指针。虚拟机通过这个指针确定对象是哪...
2018-06-07 12:42:31 298
原创 对象的创建
此处指普通Java对象的创建,不包括数组、Class对象。JVM遇到一条new指令时,会执行以下动作。1.检查类的加载if((这条指令的参数能否在常量池中找到一个类的符号引用)&&(这个符号引用代表的类已经被加载、解析、初始化)) { //类已经加载}}else { 执行加载过程}2.为新建的对象分配内存,所需内存大小在类加载完成后已经确定。if(堆内存是规整的) {...
2018-06-06 23:52:14 153
原创 [LeetCode] Longest Palindromic Substring
回文数分奇偶数长度两种情况: 奇数长度,以中间的字符为轴左右相等,判等从中间字符两侧的字符开始向左右展开。设此时轴为i 偶数长度,以中间两个字母的分界线为轴左右相等,判等从中间两个字符开始向左右展开。设此时轴为(i,i+1)每次迭代以当前的字符 i 和 (i,i+1) 为轴进行判等,并试图更新最长子序列。这里找的是第一个,所以比原有的长才会更新。判定回文数O(n),遍历O(n),总共O...
2018-06-06 23:17:49 149
原创 [LeetCode] Longest Substring Without Repeating Characters
用left、right两个指针(用的是数字,当成指针来理解)在String上移动。每次迭代判定right指向的字符是否存在于HashMap中: 如果不存在,把这个字符加入HashMap,right向右移动一格,尝试更新最大长度max; 如果存在,设前面的串中与当前判定的字符相同的字符c的位置为i,把left一步一步移动到i+1位置,途径的元素从HashMap删掉。class Solut...
2018-06-05 16:12:32 154
转载 HashMap 与HashTable的区别
HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源,特性,算法等多个方面进行对比总结。力争多角度,全方位的展示二者的不同,做到此问题的终结版。1 作者 Hashtable的作者: HashMap的作者: Hash Map的作者比Hashtable的作者多了著名顶顶的并发大神Doug Lea。他写了util.c...
2018-06-03 23:33:57 150
原创 Java内存区域的划分
运行时数据区包括:方法区、堆、虚拟机栈、本地方法栈、程序计数器。其中前两个是线程共享的,后面三个是线程私有的。1.方法区: 方法区存储被虚拟机加载的类信息(类的名称、方法信息、字段信息)、常量、静态变量、JIT编译后的代码。是线程共享的, 方法区里有一个部分叫常量池,编译期生成的各种字面量和符号引用会在类加载后进入方法区的运行时常量池中。在厂商的实现中,常量池里通常还会存放翻译...
2018-06-03 23:20:35 156
原创 [LeetCode] Add Two Numbers
要注意的点是迭代是每次向前的,所以设置一个head表示答案前面的一个node,类似链表的头节点。用一个引用从head开始向后迭代,l1、l2就直接指向下一个就可以,后面也不用了。用一个carry记录有无进位。迭代完成后检查有没有进位,有就多加一个1,最后不要head,返回head的下一个node。class Solution { public ListNode addTwoNumbers(...
2018-06-03 22:36:28 151
原创 [LeetCode] Two Sum
暴力破解太笨了。用散列表建立“数组元素”与“和目标值的差值”的映射,同时检查hashmap中已有的内容,一旦找到直接输出。import java.util.Arrays;class Solution { public int[] twoSum(int[] nums, int target){ HashMap<Integer,Integer> map = new Ha...
2018-06-02 15:56:36 137
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人