数据结构
小米内推官_AngelDg
我们总以为,是生活欠我们一个“满意”,其实是我们欠生活一个“努力”。
展开
-
[每日一题]96:两数之和
题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]方法一:暴力(会超时)暴力算法时间复杂度O(n²),空间复杂度O(1)class Solution {public:原创 2020-08-26 10:12:35 · 218 阅读 · 0 评论 -
剑指Offer --- 全题目题解汇总
题目序号题目描述1赋值运算符重载2单例模式3数组中重复的数字原创 2020-10-18 23:37:14 · 531 阅读 · 2 评论 -
[每日一题]35:二叉树的最近公共祖先
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,...原创 2020-04-09 20:42:41 · 239 阅读 · 0 评论 -
[剑指Offer]:二叉搜索树的最近公共祖先
文章目录题目描述题解思路题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q =原创 2021-02-12 22:37:15 · 124 阅读 · 0 评论 -
[剑指Offer]:队列的最大值
文章目录题目描述题解思路题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入: ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出: [null,原创 2021-02-04 00:43:21 · 212 阅读 · 0 评论 -
[剑指Offer]:滑动窗口的最大值
文章目录题目描述题解思路方法一:暴力解法方法二:使用双端队列 deque题目描述给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3原创 2021-02-03 23:22:08 · 145 阅读 · 0 评论 -
[剑指Offer]:数组中数字出现的次数
文章目录题目一题解思路:分组异或题目二题解思路:方法一:排序方法二:hashmap方法三:位运算题目一一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]题解思路:分组异或先对所有数字进行一次异或,得到两个原创 2021-02-01 23:43:00 · 220 阅读 · 4 评论 -
[剑指Offer]:平衡二叉树
文章目录题目描述题解思路方法一:先序遍历方法二:后序遍历题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2原创 2021-02-01 18:59:44 · 119 阅读 · 0 评论 -
[剑指Offer]:在排序数组中查找数字
文章目录题目描述题解思路方法一:遍历数组方法二:hashmap方法三:利用函数 lower_bound 与 upper_bound方法四:二分法题目描述统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0题解思路方法一:遍历数组思路不讲武德。代码实现:class Solution {public:原创 2021-01-30 16:24:23 · 186 阅读 · 0 评论 -
[剑指Offer]:数据流中的中位数
文章目录题目描述题解思路题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的原创 2021-01-21 22:02:18 · 120 阅读 · 0 评论 -
[剑指Offer]:二叉搜索树的后序遍历序列
文章目录题目描述题解思路题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true题解思路二叉搜索树的性质:根节点左侧的所有节点的值一定小于等于根节点的值,根节点右侧的所原创 2021-01-19 23:00:19 · 155 阅读 · 0 评论 -
[每日一题]33:二叉树的层序遍历(从上往下,之子形顺序,从下往上)
题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]解答代码:/** * Definition for a binar...原创 2020-04-09 12:11:39 · 404 阅读 · 0 评论 -
[剑指Offer]28:栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解答代码:class Solution {public: bool IsP...原创 2020-04-08 08:26:12 · 142 阅读 · 0 评论 -
[剑指Offer]:最小栈
题目描述设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack....原创 2020-04-07 22:46:40 · 149 阅读 · 0 评论 -
[每日一题]38:二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5递归思路解答代码:/*struct TreeNode { int val; struc...原创 2020-04-09 22:07:15 · 212 阅读 · 0 评论 -
[剑指Offer]:重建二叉树(P:代码测试)
文章目录题目描述正确思路题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。正确思路 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值。但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边。因此我们需要扫描中序原创 2020-10-29 12:22:00 · 288 阅读 · 0 评论 -
[剑指Offer]:对称的二叉树
文章目录题目描述题解思路:递归题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1:输入{8,6,6,5,7,7,5}返回值true示例2:输入{8,6,9,5,7,7,5}返回值false题解思路:递归设置一个递归函数isSame(r1, r2),表示如果对称,返回true,否则返回false递归终止条件:r1==nullptr && r2==nulllptr; 直接返回tru原创 2021-01-13 12:17:14 · 96 阅读 · 0 评论 -
[剑指Offer]:树的子结构
文章目录题目描述题解思路:递归题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1:输入{8,8,#,9,#,2,#,5},{8,9,#,2}返回值true题解思路:递归递归函数的功能:判断2个数是否有相同的结构,如果相同,返回true,否则返回false递归终止条件:如果树B为空,返回true,此时,不管树A是否为空,都为true否则,如果树B不为空,但是树A为空,返回false,此时B还没空但A空了,显然false原创 2021-01-12 14:57:00 · 116 阅读 · 0 评论 -
[剑指Offer]:合并两个排序的链表
文章目录题目描述解答思路方法一: 递归方法二:题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例:输入{1,3,5},{2,4,6}返回值{1,2,3,4,5,6}解答思路方法一: 递归递归函数结束的条件是什么?对于链表就是,如果为空,返回什么递归函数一定是缩小递归区间的,那么下一步的递归区间是什么?跟迭代方法中的一样,如果PHead1的所指节点值小于等于pHead2所指的结点值,那么phead1后续节点和pHea原创 2021-01-12 13:06:58 · 138 阅读 · 0 评论 -
[剑指Offer]:两个链表的第一个公共节点
两个链表,判断是否相交,找出相交的第一个点?首先应该清楚两个单链表相交要么都是无环链表,要么都是有环链表,不存在一个有环链表和一个无环链表相交,因为两个链表一旦相交则后续的链表都应该是相同的将其中任意一个链表的环打破,即让尾结点指向null(记下保存原本应当指向的位置),然后判断第二个链表是否含有环,若第二个链表无环则相交,否则不相交利用 判断单链表是否有环 的方法,对链表使用两个快慢指针进行判断是否有环,两个指针的碰撞点即在环上,那么判断链表二的环上是否包含该碰撞点就可以判断两个链表是否相交原创 2020-09-22 09:33:17 · 253 阅读 · 0 评论 -
带你理解最小生成树的生成
最小生成树介绍Prim算法简述应用知识点习题:介绍一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树(Minimum Spanning Tree,MST)可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图原创 2020-09-03 11:14:18 · 1788 阅读 · 0 评论 -
详解算法的时间复杂度与空间复杂度
文章目录时间复杂度空间复杂度知识点习题:算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。因此,评价一个算法的效率主要是原创 2020-08-28 23:20:50 · 613 阅读 · 0 评论 -
带你轻松搞懂跳表(skip list)
跳表什么是跳表跳表的性质:查询插入删除什么是跳表我们知道二叉搜索算法能够高效的查询数据,但是需要一块连续的内存,而且增删改效率很低。跳表,是基于链表实现的一种类似“二分”的算法。它可以快速的实现 增,删,改,查 操作。链表,相信大家都不陌生,维护一个有序的链表是一件非常简单的事情,我们都知道,在一个有序的链表里面,查询跟插入的算法复杂度都是O(n)。我们能不能进行优化呢,比如我们一次比较两个呢?那样不就可以把时间缩小一半?同理,如果我们4个4个比,那不就更快了? 就好像火车,有快车有慢原创 2020-08-26 16:45:18 · 726 阅读 · 0 评论 -
带你理解字典树(前缀树)
字典树概念前缀树的3个基本性质:Trie树应用:前缀树查询和哈希查询的比较:举个栗子概念Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词。Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是 用于统计和排序大量的字符串(但不仅限于字符串) ,所以经常被搜索引擎系统 用于文本词频统计 。它的优点是: 最大限度地减少无谓的字符串比较 。Trie的核心思想是 空间换时间 。利用字符串的公共前缀来降低查询原创 2020-08-16 17:53:52 · 417 阅读 · 0 评论 -
八种基本排序的含图详解
八种基本排序详解网址[冒泡排序https://blog.csdn.net/AngelDg/article/details/98535039选择排序https://blog.csdn.net/AngelDg/article/details/103446151插入排序https://blog.csdn.net/AngelDg/article/details/10...原创 2020-02-16 23:27:46 · 1823 阅读 · 0 评论 -
带你认识哈夫曼树
哈夫曼树树的4个概念哈夫曼树概念构建一个哈夫曼树树的4个概念什么是路径?在一棵树中,从一个结点到另一个结点所经过的所有结点,被我们称为两个结点之间的路径。上面的二叉树当中,从根结点A到叶子结点H的路径,就是A,B,D,H。什么是路径长度?在一棵树中,从一个结点到另一个结点所经过的“边”的数量,被我们称为两个结点之间的路径长度。仍然用刚才的二叉树举例子,从根结点A到叶子结点H,共经过了3条边,因此路径长度是3。什么是结点的带权路径长度?树的每一个结点,都可以拥有自己的“权重原创 2020-08-05 19:16:54 · 1866 阅读 · 0 评论 -
带你理解线性表、广义表
线性表什么是线性表呢?线性表的基本概念顺序存储结构和链式存储结构前驱和后继什么是线性表呢?线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。如图 1 所示,这是一组具有“一对一”关系的数据,我们接下来采用线性表将其储存到物理空间中。首先,用“一根线儿”把它们按照顺序“串”起来,原创 2020-08-05 13:46:35 · 5009 阅读 · 0 评论 -
图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
遍历深度优先遍历无向图的深度优先遍历图解有向图的深度优先遍历图解广度优先遍历无向图的广度优先遍历图解有向图的广度优先遍历图解图的遍历,所谓遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略:深度优先遍历广度优先遍历深度优先遍历深度优先遍历(Depth First Search)的主要思想是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的原创 2020-07-31 10:31:21 · 5726 阅读 · 3 评论 -
详解二叉树的后序遍历
后序遍历:首先遍历左子树,然后遍历右子树,最后访问根节点(左->右->根)后序遍历的递归算法思路:遍历左子树遍历右子树访问根节点代码如下:void BinaryTreePostOrder(BTNode* root){ if (root){ BinaryTreePostOrder(root->lChild); BinaryTreePostOrder(...原创 2020-02-26 21:11:39 · 1893 阅读 · 0 评论 -
详解二叉树的中序遍历
中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树(左->根->右)中序遍历的递归算法思路:遍历左子树访问根节点遍历右子树代码如下:void BinaryTreePrevOrder(BTNode* root){ if (root){ BinaryTreePrevOrder(root->lChild); putchar(root->dat...原创 2020-02-26 20:50:17 · 1625 阅读 · 0 评论 -
详解二叉树的层序遍历
思路借助队列完成先将二叉树根节点入列取队顶打印如果她有左孩子就入队左孩子;如果有右孩子就入队右孩子队顶出队(队列为空,则跳出;不会空,则返回步骤2直至队列为空)图解层序遍历#include ""#include ""//二叉树层序遍历(队列):二叉树层层压栈,层层递归跳出(先入先出)void BinaryTreeLevelOrder(BTNode* root){ Q...原创 2020-02-26 18:42:51 · 449 阅读 · 0 评论 -
详解二叉树的前序遍历
思路先使用二叉链的结构写一个建立二叉树的函数(函数返回根节点)代码以前序遍历方式输入二叉树,当输入“#”时,指针指向NULL,说明是该结点是为空结点二叉树的前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树(根->左->右)顺序:访问根节点->前序遍历左子树->前序遍历右子树前序遍历递归算法图解前序遍历代码如下:#include <stdi...原创 2020-02-23 14:43:45 · 1551 阅读 · 0 评论 -
[剑指Offer]:反转链表
题目描述:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL方法一:每次将cur后的节点翻至头节点前void SListReverse(SList * plist){ assert(plist->_head); SListNode * tmp = ...原创 2020-01-19 23:33:20 · 214 阅读 · 0 评论 -
详解二叉树的四种遍历方式
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。在二叉树的遍历中存在三种较为常用的遍历方式:前序遍历、中序遍历、后序遍历前序遍历使用递归方式实现前序遍历的具体过程为:先访问根节点再序遍历左子树最后序遍历右子树中序遍历使用递归方式实现中序遍历的具体过程为:先中序遍历左子树再访问根节点最后中序遍历右子树后序遍历使用递归...原创 2020-02-19 11:43:17 · 2322 阅读 · 0 评论