数据结构
文章平均质量分 55
知识不足恐惧症
这个作者很懒,什么都没留下…
展开
-
判断第二个序列是否为第一个序列的弹出
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。LeetCode原题:栈的压入、弹出序列思路:第一个序列表示栈的压入顺序,因为在压入过程中,随时可能从当前序列弹出,所以可以构建一个辅助栈,模拟栈的压入过程,设置两个指针,分别指向第一个压入序列和第二个弹出序原创 2020-08-08 22:54:19 · 153 阅读 · 0 评论 -
贪心算法---会议室问题
问题:有一堆会议,每个会议都有开始时间和结束时间,问至少需要几个房间可以安排下这些会议?解决思路:这是个贪心类问题, 每个会议都有结束时间和开始时间,可以对两个时间分开存储并排序,从最先开始的会议开始遍历,只要当前会议的开始时间小于结束时间数组中的第一个结束时间,就需要重新开辟一个房间。接着看下一个会议的开始时间,如果开始时间依旧小于结束时间,那么还需要一个房间用作这个会议,如果开始时间大于等于结束时间,说明这个会议开始的时候,前面的会议中至少有一个已经结束了,此时不需要重新开辟一个新房间,复用即可,原创 2020-08-01 23:15:01 · 1692 阅读 · 0 评论 -
数据结构----表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。LeetCode原题:表示数值的字符串分析一下能够字符串能够表示数值的满足条件有:指数符号只能出现一次;正负号出现的地方的前一位置必须是指数符号,或者是在开头位置出现;指数符号不能出现在开头;小数点同样只能出现一次,并且不能在指数符号原创 2020-07-07 22:46:59 · 97 阅读 · 0 评论 -
由先序、中序、后序遍历重建二叉树
先序、中序重建给定先序遍历和中序遍历数组,依次重建出整个二叉树由先序遍历可知,先序遍历的第一个值就是整个树的根节点,在中序遍历数组中找到该值对应的位置,则该位置左边部分就是整个树的左子树,右边就是整个树的右子树。得到了左子树和右子树长度后,可以根据该长度确定,在先序遍历中下一个右子树的根节点位置,而左子树的位置,因为是先序遍历,所以当前根节点的下一位就是它的左子树。左子树、右子树的节点位置确定后,递归建立剩余的左子树和右子树,当左子树和右子树的位置相等时,结束递归。代码如下:# Definiti原创 2020-06-28 16:27:35 · 210 阅读 · 0 评论 -
排序算法--冒泡排序、选择排序、归并排序、快速排序、堆排序、计数排序
冒泡排序最简单的排序,原理非常简单,只要当前数比后面的数大,就把当前数往后移,直到数组末尾。def bubble_sort(arr): if len(arr) < 2: return arr j = len(arr) - 1 while j > 0: for i in range(j): if arr[i] > arr[i + 1]: arr[i], arr[i + 1]原创 2020-06-14 15:22:58 · 471 阅读 · 0 评论 -
累加和小于等于 aim 的最长子数组
题目:给定一个数组 arr 和目标值 aim,求该数组的子数组中累加和小于等于 aim 的最长子数组长度思路准备两个辅助数组,一个是 min_num, 其中存放的是以当前位置为左边界,能够取得的最小累加和是多少;另一个辅助数组是 min_index ,存放的是 该位置取得最小累加和时候的右边界位置。首先考虑两个辅助数组的求解, min_num 因为求的是以当前位置为左边界的最小累加和,所以我们可以考虑从右往左求解,最后一个位置存放的当然就是 arr 中最后一个数本身,相应的 min_index 存放原创 2020-06-07 16:27:12 · 164 阅读 · 0 评论 -
面试算法之正则表达式匹配
题目:请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。原题来自LeetCode:思路假设 字符串为 str , 正则表达式为 exp ,显然这里的变量是 exp,而表达式中最让人头疼的部分就是碰到了 * 怎么办?所以可以根据表达式中 * 的出现情况分类讨论,这里采原创 2020-06-07 15:32:21 · 107 阅读 · 0 评论 -
递归和队列实现基本计算器
题目:实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。LeetCode:https://leetcode-cn.com/problems/basic-calculator-ii/思路先不考虑空格,以及乘除、括号,假设现在有一个最简单的表达式,只有加减两种运算符,也没有括号,应该如何运算?显而易见,从左到右,依次遍历即可,那我们先把这样的情况翻译成代码,借助队列,队列中从0位置到最后一个位置,对原创 2020-05-31 17:02:27 · 461 阅读 · 0 评论 -
最大搜索二叉树的大小
问题给定一个二叉树,求它的最大搜索二叉树的大小解决思路:分成三种情况来考虑:当前节点的左子树是搜索二叉树,而右节点并不是搜索二叉树;或者左节点的最大搜索二叉树的大小大于右节点的最大搜索二叉树的大小,那么此时最大的搜索二叉树就是它的左子树;当前节点的右子树是搜索二叉树而左节点不是搜索二叉树;又或者左节点的最大搜索二叉树的大小小于右节点的最大搜索二叉树的大小,那么此时最大的搜索二叉树就是它的右子树;当前节点的左子树和右子树都是搜索二叉树,并且当前节点的值大于左子树的最大搜索二叉树的最大值,小于右子原创 2020-05-24 21:38:22 · 229 阅读 · 0 评论 -
二叉树之二叉搜索(排序、查找)树、AVL树、红黑树、SB(Size Balanced Tree)树
概念篇1.二叉查找树,也叫二叉搜索树、二叉排序树,Binary Search Tree在二叉查找树中,有以下性质;若任意节点的左子树不为空,则左子树上的所有节点的值小于它的根节点;若右子树不为空,则右子树的所有节点大于它的根节点;任意节点的左右子树也都是二叉查找树;树中不存在重复值;...原创 2020-05-24 21:07:23 · 272 阅读 · 1 评论 -
和为aim的最长子数组长度
问题:求在给定的数组中,子数组中所有数加起来的和等于固定值 aim 的最长子数组长度。解题思路:准备一个字典,key是从 -1 位置到当前位置的累加和,value 是第一次得到这个累加和的位置。默认 -1 位置的累加和是0.从头开始遍历数组,每次都计算从 -1 位置到当前位置的累加和是多少,并将位置信息和 累加和存到字典中,如果一个累加和出现多次,只记录第一次出现这个累加和的位置,因为我们要求的是最长的子数组。当累加和减去 aim的差值出现在字典中时,表明该差值对应的位置的下一个位置到当前位置,累原创 2020-05-24 15:26:41 · 191 阅读 · 0 评论 -
Morris遍历中的先序、中序、后序实现
Morris遍历先介绍一下Morris遍历的具体过程,至于先序、中序和后序就是在遍历中选择不同时机进行打印。在Morris遍历中,我们假设当前节点为 cur,只要当前节点的左节点存在,顺着左节点的右边一直走到它的最右边界节点,如果是第一次遍历到这个最右边界节点,那么这个边界节点的 right 应该指向 None,这里做一个标记,将它的 right 不再指向 None,改为指向当前的 cur 节点, 此时cur 下一步就应该来到cur的左节点;如果不是第一次来到这个最右边界节点,那么最右边界的 ri原创 2020-05-24 14:05:27 · 341 阅读 · 0 评论 -
最大值减去最小值小于等于num的子数组数
满足条件的子数组数问题:给定一个数组,固定数 num,该数组的子数组中,有多少个子数组满足 在该子数组中最大值 - 最小值 小于或者等于 num?还是滑动窗口类问题,子数组可以看成是一个滑动窗口,不过该窗口长度是可变的,同样可以借助双端队列完成。不过在这题中,需要两个双端队列,一个存放最大值,一个存放最小值,具体更新原理和上一篇差不多(见滑动窗口最大值问题)。不同之处在于,此题中,我们需要判断当前窗口内的最大值和最小值是否满足条件,满足则结果 + 1。但这里额外需要了解两个性质,性质1. 当一原创 2020-05-17 19:51:04 · 310 阅读 · 0 评论 -
滑动窗口系列之求窗口中最大值问题
滑动窗口最大值问题: 给定一个数组,窗口长度为 k ,求每次窗口从左往右划过时每个窗口中的最大值解决思路: 利用双端队列的性质----头部和尾部都能出和进;队列中保存的是每个窗口内的最大值信息,关键在于窗口移动的过程中,如何更新其中的最大值信息。在每次窗口向右移动的过程中,都要判断两个信息:第一个,当前窗口的最大值是否需要更新;解决方法: 判断当前值是否大于队列的尾部上的值,不成立的话就直接压入当前位置到队列尾部;如果成立,说明此时最大值需要更新了,那么把队列的尾部值弹出丢弃,直到当前值大原创 2020-05-17 15:41:35 · 466 阅读 · 0 评论 -
让人头大的KMP算法
KMP算法:什么是kmp?给定两个字符串,分别为 str1 和 str2 ,问:在 str1 中,是否存在子字符串和 str2 相等?简单暴力法str1 从头开始遍历,如果当前字符和 str2 中第一个字符相等,则判断 str1 下一个字符和 str2 第二个字符是否相等,如果相等,继续判断第三个、第四个、、,如果不相等,那么 str2 又要回到开头位置,等待下一次, str1 也要...原创 2020-04-30 16:50:17 · 92 阅读 · 0 评论 -
深度优先遍历DFS和宽度优先遍历BFS
深度优先遍历和宽度优先遍历,其实算法原理都很相似,区别在于**深度遍历:只有当一个节点的所有后代被访问完,才会访问同层的下一个节点;宽度遍历: 只有同层的所有节点访问完,才会继续访问下一层节点**因此在设计算法时,深度遍历可以借助栈,先压当前节点再压后代,就保证了不会漏掉该节点的每一个后代,先后顺序也不会乱;而宽度遍历借助队列,则保证了每次压入队列时先弹出的都是同一层的节点。深度优先遍历(...原创 2020-04-25 22:39:32 · 348 阅读 · 0 评论 -
数据结构算法之判断是否为平衡二叉树
数据结构什么叫平衡二叉树?如果在一棵二叉树中,任何一个子树的左右子树的深度差(高度差)不超过1,则该二叉树输入平衡二叉树,否则不是。判断方法有两种:1. 从上往下依次递归判断首先假设当前的头结点高度为1,每往下走一层高度+1,只要当前节点不为None,则递归获取当前节点的左子树高度和右子树高度;在每轮递归时都要判断当前左子树和右子树的高度差是否大于1,如果大于1,则直接返回Fals...原创 2020-04-24 17:59:19 · 603 阅读 · 0 评论