数据结构与算法
文章平均质量分 62
30年后世界会是怎样
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 66. 构建乘积数组
解题思路:本题的难点在于 不能使用除法 ,即需要 只用乘法 生成数组 BB 。根据题目对 B[i]B[i] 的定义,可列表格,如下图所示。根据表格的主对角线(全为 11 ),可将表格分为 上三角 和 下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可 不使用除法 就获得结果。算法流程:初始化:数组 BB ,其中 B[0] = 1B[0]=1 ;辅助变量 tmp = 1tmp=1 ;计算 B[i]B[i] 的 下三角 各元素的乘积,直接乘入 B[i]B[i] ;计算 B[i]转载 2021-03-14 12:51:13 · 102 阅读 · 1 评论 -
有限状态机(DFA)字符串转换整数 (atoi)(leetcode 8题)
确定有限状态机(deterministic finite automaton, DFA)思路字符串处理的题目往往涉及复杂的流程以及条件情况,如果直接上手写程序,一不小心就会写出极其臃肿的代码。因此,为了有条理地分析每个输入字符的处理方法,我们可以使用自动机这个概念:我们的程序在每个时刻有一个状态 s,每次从序列中输入一个字符 c,并根据字符 c 转移到下一个状态 s'。这样,我们只需要建立一个覆盖所有情况的从 s 与 c 映射到 s' 的表格即可解决题目中的问题。算法本题可以建立如转载 2021-03-13 13:46:20 · 239 阅读 · 0 评论 -
确定有限状态机
DFA在计算理论中,确定有限状态自动机或确定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移的自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表Σ的字符,它都能根据事先给定的转移函数转移到下一个状态(这个状态可以是先前那个状态)。可以通过建立状态机来解决问题。每次输入都会引起状态的改变或者不变。再次输入一个值,状态又会改变。我们把所有状态罗列出来,每次输入都改变他的状态。如果最后的状态是合法的,那么证明这个输入符合条件。转载 2021-03-03 10:59:36 · 447 阅读 · 0 评论 -
KMP算法解析
字符串匹配问题 所谓字符串匹配,是这样一种问题:“字符串 P 是否为字符串 S 的子串?如果是,它出现在 S 的哪些位置?” 其中 S 称为主串;P 称为模式串。下面的图片展示了一个例子。字符串匹配的任务:在主串中找到模式串 主串是莎翁那句著名的 “to be or not to be”,这里删去了空格。“no” 这个模式串的匹配结果是“出现了一次,从S[6]开始”;“ob”这个模式串的匹配结果是“出现了两次,分别从s[1]、s[10]开始”。按惯例,主串和模式串都以0开始编号。.转载 2021-01-18 18:51:30 · 409 阅读 · 0 评论 -
快速排序-挖坑填数+分治法
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明----挖坑填数+分治法:.转载 2020-06-24 06:53:13 · 425 阅读 · 0 评论 -
漫画算法:什么是外部排序?
背景西天取经的路上,一样上演着编程的乐趣.....排序的时候我们可以选择快速排序或归并排序等算法。为了方便,我们把排序好的2G有序数据称之为有序子串吧。接着我们可以把两个小的有序子串合并成一个大的有序子串。注意:读取的时候是每次读取一个int数,通过比较之后在输出。按照这个方法来回合并,总共经过三次合并之后就可以得到8G的有序子串。接下来把12个数据分成4份,然后排序成有序子串然后把子串进行两两合并...转载 2020-06-09 20:29:49 · 167 阅读 · 1 评论 -
二叉搜索树的后序遍历序列题解
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= 1000思路:后序遍历,最后一个元素是树的根,右子树不为空,...原创 2020-06-03 18:42:45 · 187 阅读 · 0 评论 -
从上到下打印二叉树题解
题目:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]提示:节点总数 <= 1000思路:层次遍历二叉树代码:/** * Definition for a binary tree node. * public class TreeNode { *...原创 2020-06-03 16:58:52 · 179 阅读 · 0 评论 -
栈的压入、弹出序列题解(java)
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3.原创 2020-06-03 14:43:32 · 234 阅读 · 0 评论 -
【Java】 用PriorityQueue实现最大最小堆
PriorityQueue(优先队列),一个基于优先级堆的无界优先级队列。实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆。PriorityQueue<Integer> minHeap =newPriorityQueue<Integer>();//小顶堆,默认容量为11PriorityQueue<Integer> maxHeap =newPriorityQueue<Intege...转载 2020-06-01 17:39:32 · 795 阅读 · 0 评论 -
包含min函数的栈题解
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回...原创 2020-06-01 18:05:23 · 154 阅读 · 0 评论 -
顺时针打印矩阵题解
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <= matrix[i].len...原创 2020-05-29 20:54:45 · 186 阅读 · 0 评论 -
对称二叉树题解
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树[1,2,2,3,4,4,3] 是对称的。1/ \2 2/ \ / \3 4 4 3但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的:1/ \2 2\ \3 3示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:...原创 2020-05-29 18:00:46 · 223 阅读 · 0 评论 -
二叉树的镜像题解
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ \2 7/ \ / \1 3 6 9镜像输出:4/ \7 2/ \ / \9 6 31示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制:0 <= 节点个数 <= 1000思路:递归的交换左右子树代码:...原创 2020-05-29 17:21:59 · 233 阅读 · 0 评论 -
树的子结构题解(java)
题目:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:3/ \4 5/ \1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1:输入:A = [1,2,3], B = [3,1]输出:false示例 2:输入:A = [3,4,5,...原创 2020-05-29 14:23:34 · 172 阅读 · 0 评论 -
平衡二叉树的判断
题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } .原创 2020-05-26 22:33:32 · 191 阅读 · 0 评论 -
二叉树每个节点的高度
题目:树节点的结构为:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */求每个节点的高度,并保存在节点的val中代码: public int height(TreeNode root)原创 2020-05-26 22:21:59 · 1785 阅读 · 0 评论 -
相同的树(二叉树)
题目:给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。代码:class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { //一棵为空,一棵不为空,两棵皆不为空但是根节点的值不相同,则两棵树一定不相同 if(p == null && q != null || p != nu.原创 2020-05-26 21:31:29 · 414 阅读 · 0 评论 -
数学七大基本思想方法
第一:函数与方程思想(1)函数思想是对函数内容在更高层次上的抽象,概括与提炼,在研究方程、不等式、数列、解析几何等其他内容时,起着重要作用(2)方程思想是解决各类计算问题的基本思想,是运算能力的基础高考把函数与方程思想作为七种重要思想方法重点来考查第二:数形结合思想:(1)数学研究的对象是数量关系和空间形式,即数与形两个方面(2)在一维空间,实数与数轴上的点建立一一对应关系在二维空间,实数对与坐标平面上的点建立一一对应关系数形结合中,选择、填空侧重突出考查数到形的转...转载 2020-05-26 14:41:21 · 9816 阅读 · 0 评论 -
十大排序算法和七大查找算法总结(原理讲解和代码实现)
0. 干货总结0.1 整体分类首先让我们宏观的分类一下几种排序算法:我们平常所说的排序算法大部分是指内部排序算法,其实还有三种常见的外部排序算法~那么什么是内部排序和外部排序呢?所谓的内排序是指所有的数据已经读入内存,在内存中进行排序的算法。排序过程中不需要对磁盘进行读写。同时,内排序也一般假定所有用到的辅助空间也可以直接存在于内存中。与之对应地,另一类排序称作外排序,即内存中无法保存全部数据,需要进行磁盘访问,每次读入部分数据到内存进行排序。下面给出它们的具体分类: 内部排序算法转载 2020-05-25 21:24:42 · 1328 阅读 · 0 评论 -
算法中的渐进符号
1.记号:(渐进确界)::表示={ f(n):存在常数c1,c2,,对所有的,有:}2.O记号:(渐进上界)记号渐进给出一个函数的上下界,当只有渐近上界时,使用“O”记号。={ f(n): 存在常数c,,对所有的,有:},因为记号强于O记号。例子:任意一个线性函数也在中。注:该记号在有些文献中会代替符号13.记号:(渐进下界)={ f(n):存在正常数,使得对所有的,有}请看图示说明:4.o记号(非渐进紧确上界):={ f(n),对任意正常数c,.转载 2020-05-25 14:14:25 · 2714 阅读 · 0 评论 -
进制转换:二进制、八进制、十进制、十六进制相互转换
将二进制、八进制、十六进制转换为十进制二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”。所谓“权”,也即“位权”。假设当前数字是 N 进制,那么:对于整数部分,从右往左看,第 i 位的位权等于Ni-1对于小数部分,恰好相反,要从左往右看,第 j 位的位权为N-j。更加通俗的理解是,假设一个多位数(由多个数字组成的数)某位上的数字是 1,那么它所表示的数值大小就是该位的位权。1) 整数部分例如,将八进制数字 53627 转换成十进制:53627 = 5×8.转载 2020-05-25 13:52:53 · 802 阅读 · 0 评论 -
原码, 反码, 补码 详解
一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。2、真值因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如.转载 2020-05-25 13:46:21 · 372 阅读 · 0 评论 -
平衡二叉树、B树、B+树、B*树
1、平衡二叉树概念平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构;特点:平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程有以下规则:(1)非叶子节点只能允许最多两个子节点存在。(2)每一个非叶子节点数据分布规则为左边的子节点小当前节点的值,右边的子节点大于当前节点的值(这里值是基于自己的算法规则而定的,比如hash值);平...转载 2020-05-20 19:14:46 · 195 阅读 · 0 评论 -
30张图带你彻底理解红黑树
写在前面当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。如果你在学习过程中也会存在我的疑问,那...转载 2020-04-21 17:12:03 · 170 阅读 · 0 评论 -
数据结构和算法基础
数据结构基本概念什么是数据结构?数据数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。数据元素数据元素是数据的基本单位,又称之为记录(Record)。一般,数据元素由若干基本项(或称字段、域、属性)组成。数据结构数据结构指的是数据元素及数据元素之间的相互关系,或组织数据的形式。数据之间的结构关系逻辑结构表示数据之间的抽象关...转载 2020-04-21 16:55:17 · 478 阅读 · 0 评论 -
华为-购物单编程题解析
牛客网上好多通过的代码其实并没有通过,以下是经过验证确实可以通过全部测试用例的代码(python3)。有的时候,看长篇大论的解析不如直接看正确的代码:#初始化最大的总钱数和最大的希望购买的物品的个数N,M=3200,60 #将数组[0]重复N次,并重新连接成一个新的数组,也就是创建一个初始值为0的含有N个元素的一维数组#自变量是钱数,因变量是所买物品的钱数和重要度乘积总和,且是...原创 2020-03-02 18:36:29 · 1000 阅读 · 0 评论 -
01背包问题
问题描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8i(物品编号) 1 2 3 4 w(体积) 2 3 4 5 v(价值) 3 4 5 6 总...转载 2020-03-02 12:56:35 · 282 阅读 · 0 评论 -
查找数组内重复数字(长度为n,里面的数据的值在0-n-1之间)
1.先判断a[i]==i;等于i就跳过去,i++即可2.若a[i]!=i,先比较a[i]和a[a[i]]是否相等,相等的话,就找到了,返回true就行。3.若a[i]和a[a[i]]不相等,两者交换位置代码如下:for(int i = 0; i < n; i ++) { if (a[i] == i) { continue; } i...原创 2020-01-16 17:09:05 · 587 阅读 · 0 评论 -
64匹马,8个赛道,找出前4名最少比赛多少场?
64匹马,8个赛道,找出前4名最少比赛多少场?答案原创,转载请注明出处:http://www.cnblogs.com/reanote/p/find_4th_in_64horse.html第一步:全部马分8组,各跑一次,然后淘汰掉每组的后四名(8次);第二步:取每组第一名进行一次比赛,然后淘汰最后四名所在组的所有马(1次):分析:其实这时候红色区域的...转载 2020-01-16 15:35:13 · 401 阅读 · 0 评论 -
滑动窗口算法
概念滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。示例1给定一个整数数组,计算长度为 'k' 的连续子数组的最大总和。输入:arr [] = {100,200,300,400} k = 2输出:700解释:300 + 400 = 700暴力法我们可以很容易想到暴力法来解决这个问题,使用两个 ...转载 2020-01-16 14:13:46 · 608 阅读 · 0 评论 -
常用数据结构——树
树(Tree)的基本概念树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。二叉树每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。二叉树的性质1.若二叉树的层次从0开始...转载 2019-12-04 13:08:24 · 422 阅读 · 0 评论 -
哈夫曼编码与最优二叉树-哈夫曼树
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。哈夫曼编码,主要目的是根据使用频率来最大化节省字符(编码)的存储空间。简易的理解就是,假如我有A,B,C...转载 2019-12-03 11:28:01 · 436 阅读 · 0 评论 -
五大算法设计思想
一、分治法概念:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。思想策略:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。特征:1) 该问题的规模缩小到一定的程度就可以容易地解决...转载 2019-11-26 14:26:02 · 227 阅读 · 0 评论 -
双指针法的理解
LeetCode上的题目:盛最多水的容器给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且n的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,...原创 2019-10-31 17:35:30 · 704 阅读 · 2 评论