
数据结构和算法
文章平均质量分 57
闹闹的BaBa
这个作者很懒,什么都没留下…
展开
-
图计算介绍及其应用
1.图计算介绍 最近在看TensorFlow,tf首先会构建一个计算图,然后才会执行这个图。由此,我感觉图计算算法比较重要,不管是面试还是各种应用场景,网上看到一篇让我豁然开朗的文章,在这里记录下。2.图计算算法的应用(很重要)3.图算法畅想 鉴于它的重要性,首先,以后刷算法要着重关注一下;其次,应用场景相关的项目也要考虑。...转载 2019-11-05 14:06:03 · 2249 阅读 · 4 评论 -
---------------站内导航【算法和机器学习】---------------
站内导航算法及原理剑指offer刷题汇总机器学习实战(学习笔记)原创 2019-11-01 16:01:20 · 245 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
1.本题知识点 时间效率2. 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。3. 思路 这就是一套...原创 2019-07-18 13:41:08 · 518 阅读 · 0 评论 -
二叉树之把二叉树打印成多行
1.本题知识点 二叉树2. 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。3. 思路 考察广度优先遍历,需要用到2个队列。思路跟之字打印类似。 Java版本:import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*publi...原创 2019-07-05 11:38:05 · 199 阅读 · 0 评论 -
二叉树之重建二叉树
1.本题知识点 二叉树,递归2. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。3. 概念解析 ① 什么是二叉树? 二叉树是每个结点最多有两个子树的树结构。二叉就是只...原创 2019-06-30 11:22:09 · 396 阅读 · 0 评论 -
二进制中1的个数
1.本题知识点 位运算2. 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。3. 思路 一个巧妙的规律:一个整数减去1,再和原证书与运算,会把原整数的最右边的1变为0,其它位不变,所以有多少个1就循环几次。 比如,原整数12的二进制形式为1100,减去1变成1011.。 1100 & 1011 = 1000, 然后 (1000 - ...原创 2019-07-14 22:16:36 · 206 阅读 · 0 评论 -
二叉树之树的子结构
1.本题知识点 二叉树2. 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)3. 思路 思路比较简单,就是在A中递归查找是否有B的root节点,有的话再判断该节点的左右节点和B中root的左右节点是否相等。 Java版本:/**public class TreeNode { int val = 0; ...原创 2019-06-30 22:01:09 · 347 阅读 · 0 评论 -
栈之栈的压入、弹出序列
1.本题知识点 栈2. 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)3. 思路 需要使用辅助栈,我们拿是弹出...原创 2019-07-10 22:30:09 · 295 阅读 · 0 评论 -
数值的整数次方
1.本题知识点 位运算,二分快速幂2. 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。3. 思路 需要考虑的点: ① 指数的正负,我们可以先用绝对值,然后求出指数次方之后的结果,如果是负数取倒数即可; ② 底数不能为0,如果底数为0 可以返回0或1都可以。 ③ 精度问题,计算机中表示小数...原创 2019-07-15 16:40:11 · 211 阅读 · 0 评论 -
栈之包含min函数的栈
1.本题知识点 栈2. 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。3. 思路 此题需要借助辅助栈,存储最小值,具体过程看图解: 如上图, 每次压入数据栈时,需要比较辅助栈中最小值(末尾元素)的大小,小的话追加到辅助栈末尾,否则再复制一份最小值追加到辅助栈末尾。 Java版本:import...原创 2019-07-10 15:59:14 · 198 阅读 · 0 评论 -
二叉树之按之字形顺序打印二叉树
1.本题知识点 二叉树,栈2. 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。3. 思路 关键点: 用两个栈分别保存奇数层和偶数层的节点。 如上图,打印顺序及过程如下: 初始化,将1放入stack1. 1 奇数层 ---- stac...原创 2019-07-05 11:05:37 · 363 阅读 · 0 评论 -
栈之用两个栈实现队列
1.本题知识点 栈,队列2. 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。3. 思路 这个思路比较简单,首先明白队列是先进先出,我们用两个栈stack1 stack2模拟即可,stack1负责队列的push,stack2负责队列的pop,stack2中的数据是从stack1中pop得到的. Java版本:impor...原创 2019-07-10 14:25:33 · 218 阅读 · 0 评论 -
二叉搜索树之二叉搜索树的第k个结点
1.本题知识点 二叉树,递归2. 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。3. 思路 二叉搜索树的特性,中序遍历结果为从小到大排序的。 Java版本:/*public class TreeNode { int val = 0; TreeNode...原创 2019-07-10 14:01:50 · 210 阅读 · 0 评论 -
二叉搜索树之二叉搜索树与双向链表
1.本题知识点 二叉树,递归2. 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。3. 思路 感觉剑指offer上的第二张图不是很好理解啊,其实还是那句话,二叉树的递归主逻辑只需要考虑3个节点root, left , right。核心思路就是① 中序遍历; ② 操作指针实现双向链表; ③ 实时记录...原创 2019-07-10 13:29:24 · 197 阅读 · 0 评论 -
链表之删除链表中重复的结点
1.本题知识点 链表2. 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->53. 思路 充分利用递归思想 以及对象及引用的理解: ① 先考虑没有重复节点的情况,保留当前节点,从下一个节点开始...原创 2019-06-28 22:02:23 · 342 阅读 · 0 评论 -
二叉树之对称的二叉树
1.本题知识点 二叉树2. 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。3. 思路 如图,对称条件: ① 根节点及其左右子节点相同。 ②左子节点的左子节点等于右子节点的右子节点。 ③左子节点的右子节点等于右子节点的左子节点。 Java版本:/*public class...原创 2019-07-04 13:56:15 · 285 阅读 · 0 评论 -
链表之链表中环的入口结点
1.本题知识点 链表2. 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。3. 思路 分为2步,用2个指针实现: ① 找环中相遇点:指针p1每次循环走1步,p2每次走2步。如果找不到相遇点,无欢输出null。 ②找环的入口:在①基础上,p2移到head,然后p1和p2每次走1步,直到相遇即为入口。 Java版本:...原创 2019-06-28 17:09:38 · 271 阅读 · 0 评论 -
二叉树之二叉树的下一个结点
1.本题知识点 二叉树2. 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。3. 思路 中序遍历:d,b,h,e,i,a,f,c,g ① 如果节点有右子树,它的下一个节点就是右子树的最左节点,比如a的下一个节点就是a.right.left = f,e的下一个节点就是e.r...原创 2019-07-03 14:23:07 · 227 阅读 · 0 评论 -
二叉树之平衡二叉树
1.本题知识点 二叉树2. 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。3.平衡二叉树概念 每一个节点的左右子树的高度差的绝对值不大于1,或者本身是空树。4. 思路 剪枝,其实就是从下到上遍历,只需要遍历一次。如果采用之前计算树深的方式,会有很多重复遍历,增加开销。 ① 如果底层节点不是平衡二叉树,停止遍历,直接返回。 ②如果底层节点是平衡二...原创 2019-07-03 11:36:15 · 200 阅读 · 0 评论 -
二叉树之二叉树的镜像
1.本题知识点 二叉树,递归2. 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。3. 思路 思路比较简单,首先先弄明白什么是镜像? 然后,每次输入根节点,交换其左右子节点即可。过程如下: Java递归版本:/**public class TreeNode { int val = 0; TreeNode left = null;...原创 2019-07-01 13:23:47 · 241 阅读 · 0 评论 -
回溯法之矩阵中的路径
1.本题知识点 回溯法,矩阵2. 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的...原创 2019-07-11 15:09:40 · 312 阅读 · 0 评论 -
数据流中的中位数
1.本题知识点 树,大顶堆,小顶堆2. 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。3. 思路 此题有点小绕,我们分析一下: ...原创 2019-11-01 15:29:49 · 210 阅读 · 0 评论 -
字符流中第一个不重复的字符
1.本题知识点 字符串2. 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。3. 思路 Java 版:public ...原创 2019-08-30 15:18:08 · 210 阅读 · 0 评论 -
不用加减乘除做加法
1.本题知识点 进制转化,发散思维能力2. 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 3. 思路 总体思路:利用二进制位运算进行相加操作。 首先,先看十进制是如何计算加法。比如5 + 17, ① 相加各位的值,不做进位,得05 + 17 = 12; ②计算进位值,得10; ③将第一步和第二步的结果...原创 2019-08-28 22:50:33 · 167 阅读 · 0 评论 -
求1+2+3+…+n
1.本题知识点 进制转化,发散思维能力2. 题目描述 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 3. 思路 这题剑指上提供了四种解法,构造函数、虚函数、函数指针和模板类型求解,好麻烦的赶脚。在这里我们使用逻辑与的短路特性和递归求解此题。 Java 版:publi...原创 2019-08-28 14:08:36 · 1199 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)
1.本题知识点 抽象建模能力2. 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开...原创 2019-08-27 13:44:10 · 223 阅读 · 0 评论 -
扑克牌顺子
1.本题知识点 抽象建模能力2. 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A...原创 2019-08-26 16:13:47 · 258 阅读 · 0 评论 -
和为S的两个数字
1.本题知识点 知识迁移能力2. 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。3. 思路 这题要审明白,连续数列,可采用左右夹逼法,需要2个指针,依次判断和是否等于给定值,乘积最小的肯定是最外层的2个数(数学证明略...原创 2019-08-22 14:32:26 · 197 阅读 · 0 评论 -
最小的K个数
1.本题知识点 时间效率2. 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。3. 思路 ① 把矩阵看成由若干个顺时针方向的圈组成。先打印外面的圈,再打印里面的圈。 ② 循环打印的条件:rows > startX * 2 且 cols > startY * 2。 rows为...原创 2019-07-17 15:53:10 · 199 阅读 · 0 评论 -
和为S的连续正数序列
1.本题知识点 知识迁移能力2. 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck...原创 2019-07-19 11:47:11 · 198 阅读 · 0 评论 -
丑数
1.本题知识点 时间空间效率的平衡2. 题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。3. 思路 总的来说,因为丑数的因子只有2,3,5,所以一个丑数肯定是由另一个丑数乘以2或乘以3或乘以5得到。比如,4,6,10是丑数,它们是由...原创 2019-07-18 23:14:13 · 189 阅读 · 0 评论 -
递归之变态跳台阶
1.本题知识点 数学归纳法,规律2. 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。3. 思路 我就举例看看n=1,2,3,4时,有1,2,4,8种跳法,即2^n-1次方,总的跳法就把它们加起来。别告诉我什么数学归纳,我不会! Java 版:public class Solution { ...原创 2019-07-12 15:04:27 · 394 阅读 · 0 评论 -
递归之跳台阶
1.本题知识点 递归2. 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。3. 思路 1级时,1种;2级时,2种;3级往后符合斐波那契数列。 Java 版:public class Solution { public int JumpFloor(int target) { ...原创 2019-07-12 14:35:42 · 499 阅读 · 0 评论 -
递归之裴波那契数列
1.本题知识点 递归,循环,DP2. 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=393. 思路 如图,可以用递归自顶向下计算,或者自底向上计算。 Java 递归自顶向下版:public class Solution { public int Fibonacci(int n) {...原创 2019-07-12 14:16:41 · 1310 阅读 · 0 评论 -
顺时针打印矩阵
1.本题知识点 矩阵2. 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 。 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。3. 思路 ① 把矩阵看成由若干个顺时针方向的圈组成。先打印外...原创 2019-07-16 16:12:56 · 240 阅读 · 0 评论 -
回溯法之机器人的运动范围
1.本题知识点 回溯法,矩阵2. 题目描述 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子...原创 2019-07-12 11:03:51 · 278 阅读 · 0 评论 -
二叉搜索树之二叉搜索树的后序遍历序列
1.本题知识点 二叉树,递归2. 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。3. 思路 二叉搜索树BST感觉比二叉树要简单,因为它是有规律的,二叉搜索树的左子树都比根节点要小,右子树都比根节点要大。 上述二叉搜索树的后序遍历结果为:5 7 6 9 11 10 8...原创 2019-07-08 16:41:30 · 337 阅读 · 0 评论 -
二叉树之二叉树的深度
1.本题知识点 二叉树2. 题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。3. 思路 一般想到树的深度就是遍历每条路径,路径最长的就是该树的深度。 我们换种思路想,树只有一个节点深度是1,如果有子树,树深其实就是max(子树深度) + 1。所以,我们只要求出左右子树的深度,值最大的加...原创 2019-07-02 22:48:00 · 334 阅读 · 0 评论 -
链表之两个链表的第一个公共结点
1.本题知识点 链表,规律2. 题目描述 输入两个链表,找出它们的第一个公共结点。3. 思路 1.暴力求解:遍历一个链表的每一个节点分别与另一个链表的每一个节点就行比较,时间复杂度O(mn)。 2.空间换时间(利用栈):时间复杂度为O(m+n),但需要额外的空间 – 栈。 3.巧妙利用规律,时间复杂度为O(m+n),不需要额外的空间。我们来详细介绍这种方式。思...原创 2019-06-27 14:53:24 · 306 阅读 · 0 评论 -
数组之连续子数组的最大和【时间效率】
1.本题知识点 数组,时间效率2. 题目描述 给一个整型数组,有正有负,数组中的一个或连续多个组成子序列,返回所有连续子序列中和的最大值。例如:{6,-3,-2,7,-15,1,2,2},连续子序列和的最大值为8。 Java版本:/** * 解题思路:Java中map的熟练使用 * 1.统计词频字典 * 2.遍历词频字典 */import java.util.Has...原创 2019-05-23 20:09:46 · 400 阅读 · 0 评论