
数据结构与算法
文章平均质量分 73
打磨时光
我是打磨匠,关注软件开发,打磨产品,服务人类。
展开
-
二叉树—前序遍历、中序遍历(非递归)
【转载】https://www.cnblogs.com/bigsai/p/11393609.html 层级遍历 public void cengxu(node t) {//层序遍历 Queue<node> q1 = new ArrayDeque<node>(); if (t == null) return; if (t != null) { q1.add(t)...转载 2020-01-02 22:38:42 · 122 阅读 · 0 评论 -
数据结构与算法之使用两个栈实现一个队列
public class QueueOfStack<T> { private Stack<T> stackA = null; private Stack<T> stackB = null; public QueueOfStack() { stackA = new Stack<T>(); stackB = new Stack<T...原创 2020-01-01 18:24:56 · 167 阅读 · 0 评论 -
二叉树之对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.va...原创 2019-12-21 20:40:29 · 104 阅读 · 0 评论 -
二叉树之二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 /* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = nul...原创 2019-12-21 16:29:29 · 86 阅读 · 0 评论 -
二叉树之从上向下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路:借助队列先进先出的特性 import java.util.ArrayList; import java.util.Deque; import java.util.LinkedList; /** public class TreeNode { int val = 0; TreeNode left = null; T...原创 2019-12-21 15:42:35 · 124 阅读 · 0 评论 -
二叉树之判断平衡二叉树
AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 ...原创 2019-12-21 15:03:55 · 181 阅读 · 0 评论 -
二叉树之前、中、后序遍历
前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身 /** public class TreeNode { int val = 0; T...原创 2019-12-21 11:26:34 · 242 阅读 · 0 评论 -
二叉树之二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 代码实现: /** publ...原创 2019-12-21 11:05:08 · 88 阅读 · 0 评论 -
二叉树之二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { t...原创 2019-12-21 10:32:57 · 113 阅读 · 0 评论 -
链表之查找环的入口节点
思路: 设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。以下是两个结论证明: 两个结论: 1、设置快慢指针,假如有环,他们最后一定相遇。 2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。 证明结论1:设置快慢指针fast和l...原创 2019-12-21 09:57:24 · 231 阅读 · 0 评论 -
链表之删除链表中的重复节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 /* public class ListNode { int val; ListNode next = null; ListNode(int val)...原创 2019-12-20 16:54:20 · 112 阅读 · 0 评论 -
链表之链表中倒数第k个节点
public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head == null) return head; // 肯定要遍历一次,获取整个链表的长度 int count = 0; ListNode node = head;...原创 2019-12-20 16:10:53 · 134 阅读 · 0 评论 -
Day7 排序:插入排序和冒泡排序
常用的排序: 冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序 冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 桶、计数、基数 O(n) 如何分析一个排序算法? 排序算法的执行效率 a. 最好情况、最坏情况和平均情况的时间复杂度 b. 时间复杂度的系数、常数、低阶 c. 比较次数和交换次数 排序算法...原创 2019-12-04 22:51:25 · 100 阅读 · 0 评论 -
Day6 递归:使用三行代码找到推荐人
主题:递归 递归是一种编程技巧,比如在 DFS 和 前中后序二叉树遍历中,都使用了递归的思想。 使用递归需要满足的是三个条件: 一个问题的解可以分解为几个问题的解 这个问题和分解之后的子问题,处理数据规模的不同,求解的思路是相同的 存在递归的终止条件 如何写出递归代码: 数学归纳法,找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,找出递归的终止条件。 注意 递归代码要警惕堆栈...原创 2019-12-03 20:06:56 · 146 阅读 · 0 评论 -
Day5 队列:队列在有限线程池资源中的使用
主题:队列在有限线程池资源中的使用 问:什么是队列? 答:先进先出 FIFO,和栈一样,是一种操作受限的线性表数据结构 问:队列的操作? 答:入栈和出栈 问:有哪些队列? 答: 1. 循环队列 2. 阻塞队列 3. 并发队列 问:队列的实现方式? 答:链表和数组 基于链表的实现方式,可以实现一个支持无限排队的无界队列(unbounded queue),但是可能会导致过多的请求排队等...原创 2019-12-02 22:44:52 · 115 阅读 · 0 评论 -
Day4 栈:浏览器的前进和后退
主题:使用栈实现浏览器的前进和后退功能 问:什么是栈? 答:栈是一种操作受限的线性表,具有后进先出的功能 问:栈的实现方式有哪些? 答:使用数据实现栈和使用链表实现栈 问:入栈和出栈的时间复杂度? 答:入栈和出栈的时间复杂度均为O(1),空间复杂度也为O(1);但是如果是使用数组实现的栈,并且是动态扩容的,其出栈的时间复杂度是不变的为O(1);其入栈的时间复杂度由于需要将原空间的数据复制到新的...原创 2019-12-01 22:58:12 · 140 阅读 · 0 评论 -
Day3 链表之如何写出正确的链表代码
主题:如何写出正确的链表代码? 写链表代码的技巧 1. 理解指针的引用 2. 警惕指针丢失和内存泄漏(Java 不用考虑内存泄漏的情况) 3. 利用哨兵简化实现的难度(主要是对于头结点和尾节点的操作) 4. 留意边界条件的处理 a. 如果链表为空,是否能正常运行 b. 如果链表只包含一个节点,是否能正常运行 c. 如果链表只包含两个节点,是否能正常运行 d. 代码在处理头结点和尾节点的时候...原创 2019-11-29 22:23:01 · 88 阅读 · 0 评论 -
Day2 线性表之数组与链表
数组 主题:为什么数组要从 0 开始编号? 问:什么是数组? 答:数组是一种线性表结构。用一组连续的内存空间来保存类型一致的数据。 例如 Java 中定义 int[] arr = new int[5]; 问:如何实现随机访问? 答:两个概念 1. 线性表,数组、链表、栈、队列 2. 连续的内存空间和相同的数据类型 所以才可以 随机访问(数组的杀手锏) 问:数组为什么插入和删除是低效的?...原创 2019-11-27 23:01:48 · 139 阅读 · 0 评论 -
Day1 复杂度分析
问:复杂度分析要解决什么问题? 答:分析、统计算法的执行效率和资源的消耗 问:通过代码跑一遍,统计、监控,得到算法执行的时间和占用的内存大小的局限性 答: 1. 测试结果依赖测试环境 2. 受数据规模的影响较大 问:什么是大O复杂度表示法? 答:表示代码执行时间随着数据规模增长的趋势,也称渐进时间复杂度 问:如何分析时间复杂度? 答: 1. 只关注循环执行次数最多的那一段代...原创 2019-11-26 20:36:18 · 122 阅读 · 0 评论 -
链表之5个常见的链表操作
单链表翻转 链表中环的检测 两个有序的链表合并 删除链表倒数第n个节点 求链表的中间节点原创 2019-10-28 23:00:58 · 142 阅读 · 0 评论 -
链表之单向链表判断回文
思考题: 如何判断一个字符串是否是回文字符串的问题,我想你应该听过,我们今天的题目就是基于这个问题的改造版本。如果字符串是通过单链表来存储的,那该如何来判断是一个回文串呢?你有什么好的解决思路呢?相应的时间空间复杂度又是多少呢? 使用快慢指针定位中间节点 从开始对前半部分到中间节点逆序 前后半部分比较,判断是否为回文 如图所示: 采用快慢指针 slow、fast 慢指针每次走一步: slow...原创 2019-10-27 23:05:23 · 582 阅读 · 1 评论 -
排序算法之归并排序
归并排序是利用递归与分治思想将数据序列划分成越来越小的半子序列,在对其进行排序,最后利用递归将排好序的半子序列合并成越来越大的有序序列。 归并排序中,归 即是递归的意思,即递归的将数组这般的分离为单个数组,例如:{ 9, 2, 4, 1, 5, 3, 8 } 归并排序算法的原理: 对于给定的数组序列,首先将每两个相邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为 2 或 1 的有序子...原创 2019-10-23 23:04:12 · 164 阅读 · 0 评论 -
排序算法之快速排序
快速排序是一种高效的排序算法,它采用分而治之的思想,把大的拆分成小的,小的再拆分为更小的。 其原理是:对于给定的数组,通过一趟排序之后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,知道序列中的所有数值均有序为止。 其算法步骤主要是: 分解。将输入的序列 arr[ m…n ] 划分成两个非空子序列 arr[ m…k ] ...原创 2019-10-22 23:48:13 · 234 阅读 · 0 评论 -
排序算法之插入排序
插入排序类似于打扑克,取出未排序的一张牌插入到已排序的牌中,取出的一张牌是在已排序好的牌中从后向前查找,直到查找到比当前牌小的那个位置,然后插入进去 示例代码: [9, 1, 8, 3, 6, 2, 7] [1, 9, 8, 3, 6, 2, 7] [1, 8, 9, 3, 6, 2, 7] [1, 3, 8, 9, 6, 2, 7] [1, 3, 6, 8, 9, 2, 7] [1, 2, 3,...原创 2019-10-20 21:36:11 · 107 阅读 · 0 评论 -
排序算法之时间复杂度、空间复杂度
排序算法 最好时间 平均时间 最坏时间 辅助存储 稳定性 备注 选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定 n小时比较好,适合数不多的数组排序 冒泡排序 O(n) O(n^2) O(n^2) O(1) 稳定 n小时比较好,小规模排序 ...原创 2019-10-20 20:25:06 · 120 阅读 · 0 评论 -
排序算法之选择排序
选择排序的基本原理: 对于给定的数组,经过一轮的比较火的最小的数,并将该数的位置和第一个数的位置进行交换;然后对不包含第一个数的其他数继续进行比较并进行位置的交换,一直重复到只有一个数为止。 示例:[9, 1, 8, 3, 6, 2, 7] i=0 arr[i] = 9 temp=9 index = 0 开始比较,9 > 1 temp = 1, index = 1, … 后面的都比 temp...原创 2019-10-20 20:14:54 · 97 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡排序顾名思义就是整个排序过程就像气泡一样往上升,单向冒泡排序的基本思想就是:给定 n 个数值,从第一个值开始一次对相邻的进行比较,当前面的值大于后面的值的时候,交换位置,依次比较完之后算一轮,n 个值中的最大值将在最后一位,然后对前面的 n-1 位进行第二轮比较,依次类推。 例如: { 1, 6, 3, 5, 7, 9, 8, 4 } 第一轮: 1 < 6 位置不变 { 1, 6, 3...原创 2019-10-16 23:14:18 · 168 阅读 · 0 评论 -
二分查找及其相关扩展
public class BinarySearch { /** * @desc 二分查找,将索引返回 * @param k * @param arr * @return */ public static int search(int k, int[] arr) { int low = 0; int ...原创 2019-10-16 22:25:24 · 147 阅读 · 0 评论 -
将给定字符串全部转化为小写(不能使用函数)
知识点: ASCII 码 char 和 String 的区别 A = 65 a = 97 ASCII 码 小写字母在大写字母的后面 相差 32 /** * {@link https://leetcode.com/problems/to-lower-case/} 不要使用函数 */ public class ToLowerCase { /** * @param str ...原创 2019-06-04 23:54:41 · 1162 阅读 · 0 评论 -
二分查找
二分查找 https://leetcode.com/problems/binary-search/ 二分查找是最基本的查找算法,时间复杂度是 Olog(n),其中还会包含很多的变种,比如: 第一次出现 target 的位置 最后一次出现 target 的位置 第一次出现大于 target 的地方 最后一次出现大于 target 的地方 应用场景: Fork/Join 框架 注意点: ...原创 2019-06-02 21:18:18 · 507 阅读 · 0 评论