![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
Canliture
hello, 程序分析!
展开
-
extended operands——递归数据结构的一种处理方式
AST中有关extended operands最近遇到Java语言的AST中,eclipse对于中缀表达式InfixExpression的AST一个解析后的表示方式:下面是org.eclipse.jdt.core.dom.InfixExpression#extendedOperands方法的注释:/*** Returns the live list of extended operands...原创 2019-11-28 18:56:59 · 158 阅读 · 0 评论 -
读书笔记——漫画算法(9) A*寻路算法
A* 寻路算法的讲解,这里有介绍比较清晰的文章:A* Pathfinding for Beginners首先引入两个集合,一个公式:OpenList:可到达的格子CloseList:已经走过的格子F = G + H其中,每一个格子都有三个属性值:F,G,HG:从起点走到当前格子的成本, 已经花费了多少步H:不考虑障碍的情况下,从当前格子走到目标格子的距离,离目标还有多远F:...原创 2019-11-11 21:12:52 · 237 阅读 · 0 评论 -
读书笔记——漫画算法(8) LRU缓存的实现
LRU,Least Recently Used,最近最少使用;一种资源管理算法按照字面的意思,也可以理解为缓存淘汰算法:最近最少访问的资源,我们就从缓存中淘汰出去,以免长时间占用内存且不经常访问;首先,我们定义基础的数据结构:public class LRUCache { // 自定义链表节点 private static class Node { String ...原创 2019-11-10 22:28:56 · 111 阅读 · 0 评论 -
读书笔记——漫画算法(7) 异或运算
异或运算的基本性质:0 ^ x == xx ^ x == 0作为一个因子,思考下列问题:一个无序数组里由99个不重复的正整数,范围从1~100;唯独缺少一个1~100中的整数,如何找到缺失的这个整数?可以思考累加再相减/*** 一个无序数组里由99个不重复的正整数,范围从1~100;* 唯独缺少一个1~100中的整数,如何找到缺失的这个整数?* @param arr* @r...原创 2019-11-10 19:08:58 · 194 阅读 · 0 评论 -
读书笔记——漫画算法(6) 寻找全排列的下一个数
寻找全排列的下一个数,这题的意思就是:给出一个数,求出由每位数形成的所有全排列中,大于此数的最小值注:我们给出的这个数每位都不同具体的算法描述如下:/*** * 1. 从后向前寻找逆序区域,并返回逆序区域的最左侧索引* 2. 将nums[index-1]与nums区间[index, nums.length-1]中大于nums[index-1]的最小元素进行位置交换* 3. 将...原创 2019-11-10 12:48:53 · 167 阅读 · 0 评论 -
读书笔记——漫画算法(5) 判断一个整数是否为2的整数次幂
判断一个整数是否为2的整数次幂:很容易想到的暴力破解方式,就是 从1开始乘2,不断乘,如果恰好能够等于这个要判断的数,那么就找到解,否则无解/*** 暴力枚举* @param num* @return*/public static boolean isPowerOf2(int num) { int i = 1; while(i <= num) { if...原创 2019-11-10 11:08:09 · 121 阅读 · 0 评论 -
读书笔记——漫画算法(4) 最大公约数
求最大公约数的若干个方法:暴力枚举辗转相除法(欧几里得算法)更相减损法(九章算术)上两种方法的结合优化版本public class GCD { /** * 2 * x == k, 或者 2 * x + 1 == k * 既然要求最大公约数,我们就从最大的数开始, * 那么就如上面所示,最先从x开始考虑 * @param a ...原创 2019-11-10 10:44:11 · 245 阅读 · 0 评论 -
读书笔记——漫画算法(3) 最小栈
现在我们要求实现一种特殊的栈结构:最小栈;它满足如下要求:1. 能够在O(1)时间复杂度实现入栈/出栈操作2. 能够在O(1)时间复杂度取出栈中最小的元素/** * 最小栈的实现,此数据结构的实现必须满足: * 1. 能够在O(1)时间复杂度实现入栈/出栈操作 * 2. 能够在O(1)时间复杂度取出栈中最小的元素 */public interface MinStack { ...原创 2019-11-08 20:58:48 · 172 阅读 · 0 评论 -
读书笔记——漫画算法(2) 有环链表
漫画算法:小灰的算法之旅,还算是一本挺有意思的书,值得一读有环链表是一个很有意思的问题,这里讨论了三个问题:判断一个链表有环求环的长度求环的入口点,这个是最有意思,并且有点难度的问题下面列出代码实现,代码的说明都在注释里写清楚了,很容易明白public class ListHasLoop { /** * 判断是否有环 * @param head 链表的...原创 2019-11-08 20:27:09 · 249 阅读 · 0 评论 -
读书笔记——漫画算法(1) 数据结构与排序算法
读书笔记知识导航源代码查阅方便这里的代码与JDK的实现还相差甚远,只能算作算法/数据结构的实现思路展示,很多细节没考虑...目录0. 思维导图1. 代码导航2. 数组(Array)3. 链表4. 栈(Stack)4.1 ArrayStack4.2 LinkedListStack5. 循环队列6. 二叉树7. 最小堆8. 最小优先队列0. 思维导图还没读完,未完待续…1. 代...原创 2019-11-05 09:18:53 · 274 阅读 · 0 评论 -
LeetCode 93. 复原IP地址(Restore IP Addresses)
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。示例:输入: “25525511135”输出: [“255.255.11.135”, “255.255.111.35”]分析:这里,我们考虑递归求解。同时我们需要考虑到下面的情况。下面这种情况是我最初提交代码时没考虑过的情况,这种情况需要考虑每个IP数字段都没有前置0。输入:“010010”预期输出:[“0.1...原创 2019-04-04 15:44:46 · 215 阅读 · 0 评论 -
LeetCode416. 分割等和子集——记忆化深度优先搜索 + 动态规划方法演变详解
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的...原创 2019-04-13 21:05:18 · 1659 阅读 · 0 评论 -
两个栈实现队列,两个队列实现栈
两个栈实现队列Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>(); 两个栈实现队列思路:stack1作为数据push源,数据从这里push进去,对应的队列行为就是,从尾push一个数据。public void push(int node)...原创 2019-07-14 23:13:03 · 136 阅读 · 0 评论 -
二叉树的序列化与反序列化
二叉树 序列化,反序列化的意义 :简单的来说,二叉树这种数据结构一般我们都是将其抽象,且存储在内存中的,但是为了便于传输或者存储在文件中,我们必须要去除其树形结构的抽象特点,而转化为可在网络中/文件中可以串行传输/存储的字节码(字符串)序列化,反序列化我们可以简单的看成数据的加密与解密,或者说压缩与解压缩。无论是加密/解密还是压缩/解压缩,我们都必须让前后两个过程遵循一定的 协议 ,或者说存储格...原创 2019-07-27 00:05:49 · 132 阅读 · 0 评论 -
二叉搜索树(二叉排序树)的第k小节点
概念与分析首先明确一个概念,二叉搜索树/二叉排序树的特点是:二叉树的任意节点T,都满足T.left.val < T.val && T.right.val > T.val那么通过这一特点就有一个性质:二叉排序树/二叉搜索树 的 中序遍历 结果是递增序列那么最简单的方法就是将树遍历一遍,然后存到数组A中,返回A[k-1]即可。这种方法的时间效率,空间效率都是O...原创 2019-07-27 00:39:00 · 1700 阅读 · 2 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)首先这道题可以在这里进行算法测试:复杂链表的复制定义一下算法描述的链表节点的数据结构:public class RandomListNode { int la...原创 2019-07-28 00:47:05 · 101 阅读 · 0 评论 -
HashMap源码解读
说明JDK版本jdk1.8.0_1911. 核心数据结构/*** The table, initialized on first use, and resized as* necessary. When allocated, length is always a power of two.* (We also tolerate length zero in some operation...原创 2019-08-22 02:18:02 · 138 阅读 · 0 评论 -
ConcurrentHashMap源码解读
说明JDK版本jdk1.8.0_191 1建议先理解HashMap的源码,再来理解ConcurrentHashMap源码HashMap源码解读: HashMap源码解读1. 核心数据结构与HashMap数据结构类似,它们有着相同的数据结构:/*** The array of bins. Lazily initialized upon first insertion.* Size i...原创 2019-08-22 15:58:55 · 143 阅读 · 0 评论 -
LinkedHashMap
JDK版本jdk1.8.0_191 1从继承体系的角度,LinkedHashMap是HashMap的子类public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>内部维护一个双向链表,维护插入顺序或者LRU顺序。/*** The head (eldest) of t...原创 2019-08-22 20:45:15 · 110 阅读 · 0 评论 -
数组—滑动窗口/字母哈希表简单实现 实践leetcode438, leetcode76
数组,最基础的数据结构。其最强大的用处就是:快速查询,能够在O(1)的实践复杂度下完成数据的查询这里简单介绍两个常见操作滑动窗口, 字母表的计数索引,并以两个经典面试题来实践此算法思路。1. 滑动窗口滑动窗口,通常在数组中的特点就是有左右两个边界,标识着这个区间[l, r]为一个窗口。通常此窗口在数组的合法区间内进行滑动,并且动态地记录一些有用的数据,很多情况下,能够极大地提高算法地效率...原创 2019-03-19 02:47:18 · 3376 阅读 · 8 评论