数据结构
爱吃羊的大灰狼
这个作者很懒,什么都没留下…
展开
-
判断一个树结构是否包含另一个树
//思路是使用递归,若根节点相等,则比较左右子树是否相等,否则分别判断该树的左子树或右子树是否包含原来的树,两者有一个为真即可//具体实现代码如下class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { ...原创 2018-07-23 12:29:04 · 640 阅读 · 0 评论 -
时间复杂度为O(1)的LRU算法
LRU,算法在操作缓存中常常被用到,由于其访问频繁,因此缩小LRU时间复杂度是非常必要的,好的LRU算法的实现能够很好的提高系统的稳定性数据结构中map的访问速度非常快,时间复杂度为O(1),因此在缓存结构中,可以借助map结构,同时由于缓存需要容量满时需要删除操作,并且对于最近被访问的需要重新置于头部,在数据结构中链表能够很好的完成该操作,故缓存结构借助map加链表结构来降低时间复杂度,...原创 2018-09-19 01:38:59 · 3917 阅读 · 0 评论 -
求一个数中1的个数
碰到遇到一个有趣的题,求一个数二进制的表示中1的个数,该题有两种解法,一种是使用短除法将该数直接转化为二进制数,另一种比较巧妙的算法是使用与运算,原理如下图所示 依照此种思入有如下算法int NumberOf1_Solution3(int i){ int count = 0; while (i>0) { ++ co...原创 2018-09-06 22:37:28 · 639 阅读 · 0 评论 -
求取数组中倒数 第k大的数
求数组中倒数第k大的数有多种求法,如直接使用堆排序按从小到答案,在遍历数组求取第k个数即可时间复杂度为nlog(n),还有一种较为快速的求法是维持一个最小堆,算法有nlog(n)直接将为nlog(k),当k远远小于n时,该算法将会有很大的优势,本文将介绍该种算法的具体实现, 在具体实现时,需要考虑几个因素,初始堆大小,有我们传入的k的大小决定,默认值我们赋值为 Integer.MAX_VALU...原创 2018-09-06 13:18:02 · 789 阅读 · 0 评论 -
深度分析kmp算法,从原理到实现(看了必会,简单直观)
kmp算法,常用于匹配一个字符串是否是另一个字符串的子串,不同于暴力搜索kmp算法的时间复杂度为O(m+n),网上好多对于该算法的讲解代码,但发现有木有,几乎所有的代码全是一模一样,根本没几个是自己写的,给的都是书上标准优化后的代码,直接抄下来,理解困难,原理讲解不清,含糊其词,因此本人自写一遍关于kmp算法的博客,并讲解该kmp算法的原理,以及为什么需要next数组,并证明每次最优移动次数就是n...原创 2018-09-09 15:13:43 · 6165 阅读 · 1 评论 -
leetcode gas stations l汽车能够绕圈l问题
原题描述如下There are N gas stations along a circular route, where the amount of gas at station i isgas[i].You have a car with an unlimited gas tank and it costscost[i]of gas to travel from station i to...原创 2018-08-08 13:33:08 · 174 阅读 · 0 评论 -
LeetCode 求所有根到叶数的总和。
原题 如下Given a binary tree containing digits from0-9only, each root-to-leaf path could represent a number.An example is the root-to-leaf path1->2->3which represents the number123.Find the...原创 2018-08-10 13:44:03 · 145 阅读 · 0 评论 -
复杂链表的复制问题
题意大致是这样的:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析 如果我们复制一个节点后就立即指定它的random节点可能会出现这种情况,即它的random节点还没有复制过来,这将会导致出错,故我们可以分两步进行 ...原创 2018-07-27 11:25:44 · 244 阅读 · 0 评论 -
一致性hash算法的具体实现
//在看如下代码时请确保你懂的一致性代码的原理 ,博文中采用 链表的方式来实现hash一致性算法由一个链表来保持服务器的hashcode,并且该链表中的值都是递增的,这就相当于在2的30次方里分布了四个有序的机器,接下来将数据的hashcode与四台服务器的hashcode从小到大依次进行对比 即可找到所分布的情况,需要注意的是当该数据大于所有机器的hashcode时应该讲该数据置于第一台...原创 2018-07-21 22:09:22 · 164 阅读 · 0 评论 -
寻找两个链表的公共节点
寻找两个链表的公共节点,思路:选用一个链表的第一个节点P跟另一个链表依次比较, 若一直没遇到想的的节点到p后移一位,在依次跟另一个链表的每一个节点比较,按照上述步骤重复进行,直到找找到公共节点,或指针p为空为止,具体实现逻辑下 复杂度为n*m,n和m分别为两链表的长度 /*public class ListNode { int val; ListNode next = nu...原创 2018-07-26 13:59:12 · 450 阅读 · 0 评论 -
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
如果有环, 环的数目设为n,则先让p1,p2都指向头结点,p1先向前走n步,可以发现p1,领先p2指针n步,当p2走到环口时,则p1刚走完环,与p2相遇,按照此思路求解即可public class Test { //找到一快一满指针相遇处的节点,相遇的节点一定是在环中 public static ListNode meetingNode(ListNode head)...原创 2018-07-20 16:53:01 · 1621 阅读 · 0 评论 -
重建二叉树(前提是没有重复元素)
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:递归 先确定左子树和右子树根节点,再分别根据 左右子树的前序和中序遍历,重建子树 具体实现代码如下。public class Test { ...原创 2018-07-20 13:18:33 · 414 阅读 · 0 评论 -
实现一个固定大小的最小堆
/** * Created by lin on 2018/9/13. */public class Heap { private int length; int size = 0; private Integer[] queue;//初始化堆 public Heap(int length) { this.queue = new Integ...原创 2018-09-13 22:52:25 · 996 阅读 · 0 评论