数据结构算法
数据结构相关的知识点及题解
heda3
拥有超过10年的嵌入式开发经验,新一代信息技术工程师/人工智能博士,已申请发明专利15项,其中8项成功获批授权,并在中英文期刊上发表多篇高水平学术论文。在嵌入式系统、算法开发与技术管理领域,积累了丰富的实践经验,并持续在技术社区分享在嵌入式驱动、操作系统、上位机软件、算法优化等开发过程中遇到的关键问题、创新解决方案以及深刻的技术洞察。持续跟随行业前沿,探索嵌入式开发中的最新动态与突破性技术,共同推动技术进步与创新!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
查找-之散列表/哈希表
问题: 前面的查找不可避免的要进行比较,是否能直接通过关键字key得到要查找的元素位置? 解决方法: 散列技术 通过记录的存储位置和关键字建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key) f为散列函数/哈希函数 散列表/哈希表(Hash table)--采用散列技术实现数据存储的一块连续的存储空间 散列过程: 1)存储时,散列函数计算数据的散列地址,并...原创 2020-02-04 23:34:10 · 450 阅读 · 0 评论 -
查找-之多路查找树
二叉排序树或平衡二叉树(AVL树、红黑树) 查找-之二叉排序树(查找、插入、删除) 查找-之平衡二叉树AVL和红黑树 结点只有两个孩子,且结点只能存储一个元素 问题: 一个结点只存储1个元素,在元素很多时,使得树的深度或高度很大 出现的问题是:内存存取外存的次数非常多-使得时间效率降低 解决方法: 2-3树 结构: 1970年 约翰·霍普克洛夫发明的多路查找...原创 2020-02-04 20:33:30 · 452 阅读 · 0 评论 -
查找-之平衡二叉树AVL和红黑树
在上一篇文章查找-之二叉排序树(查找、插入、删除)引出的问题是: 二叉排序树的存在的不足是插入新结点导致树不平衡,不平衡树使得查找性能下降 解决方法 构建平衡的二叉树 AVL树、红黑树 AVL树:带有严格平衡条件的二叉查找树,用平衡因子差值判断树是否平衡并通过旋转实现平衡,左右子树的高度不超过1 适用于:插入和删除次数较少(插入删除操作使得树失去平衡,为维持严格平衡旋转操作,使得性...原创 2020-02-04 18:11:39 · 392 阅读 · 0 评论 -
查找-之二叉排序树(查找、插入、删除)
问题: 有序的线性表采用:折半/二分、插值、斐波那契查找相比顺序查找效率得到提高,但是在插入和删除时效率低(为维持数据的有序性) 在高效实现查找操作时,如何提高插入和删除的效率? 在一些应用场景:在查找时需要插入和删除 解决方法: 二叉排序树 二叉排序树特点 1)若左子树不为空,左子树上所有结点的值均小于或等于它的根节点的值 2)若右子树不为空,右子树上所有结点的值均大于...原创 2020-02-04 17:22:39 · 3414 阅读 · 0 评论 -
查找-之线性索引查找
针对场景: 博客网站论坛的帖子回复、服务器日志记录 数据量大,每条记录无法做到有序排列记录 解决方法: 索引---把关键字和它对应的记录相关联的过程 索引分类:线性索引、树形索引、多级索引 线性索引:将索引项集合组织为线性结构---索引表 线性索引包括:稠密索引、分块索引、倒排索引 稠密索引 结构: 索引项---对应---记录 索引项是有序的、记录数据表可以是无序的...原创 2020-02-04 16:50:10 · 439 阅读 · 0 评论 -
查找-之有序表查找
待查找的表是有序排列的 解决的方法1: 折半查找/二分法查找 其中线性表采用的是顺序存储 //C int Binary_Search(int *a,int n,int key) { int low,high,mid; //边界的界定 low=1; high=n; while(low<=high) { mid=(low+high)/2 if(key<a[m...原创 2020-02-01 13:38:44 · 378 阅读 · 0 评论 -
查找-之顺序表查找-(数据的排列无序)
查找--摘要 静态查找表:只做查找操作的查找表 动态查找表:在查找过程中还做插入和删除数据元素的操作 查找时可改变数据元素之间的关系以获得较高的查找性能,将查找集合组织成表、树结构。也即是从数据的存储方式作出改进。 还有从算法层面做出改进:二分、插值、斐波那契查找等 顺序查找:线性查找,从表的第一个逐个开始和待查找元素比较,直到最后一个(暴力破解) //C //a为待查数...原创 2020-02-01 11:55:02 · 1261 阅读 · 0 评论 -
8.找出链表环的入口结点
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: L...原创 2019-01-29 22:56:17 · 202 阅读 · 0 评论 -
7.找出两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ 解法一: /* 关键:找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走 (因为2个链表用公共的尾部NULL...原创 2019-01-29 20:36:17 · 239 阅读 · 0 评论 -
32.变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解题思路: 分析:用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1; 当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1; 当n = 2 时, 有两种跳的方式,一...原创 2019-02-08 10:28:33 · 199 阅读 · 0 评论 -
31.跳台阶
题目描述1 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 解题思路: 如果把n级台阶的跳法看成是n的函数,则跳法记为F(n) 分为两种情况,跳一级台阶,跳二级台阶; 跳一级台阶时:后面还剩下n-1级台阶的跳法F(n-1) 跳二级台阶时:后面还剩下n-2级台阶的跳法F(n-2) 则F(n)=F(n-1)+F(n-...原创 2019-02-08 09:45:27 · 238 阅读 · 0 评论 -
30.斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 解法1:递归 缺点:需要保存中间重复参数,运算量大 class Solution { public: int Fibonacci(int n) { if(n<=0) return 0; if(...原创 2019-02-07 22:53:25 · 376 阅读 · 0 评论 -
29、栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 解题思路: 入栈的顺序如第一个序列。 栈的弹出顺序有多种。 让弹出栈的元素和...原创 2019-02-07 16:49:48 · 204 阅读 · 0 评论 -
28.包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 分析问题: 1、新建一个暂存变量存储最小值,但是当把栈中的最小的元素出栈后,剩下的栈中的最小元素将不知道 2、除了最小元素保存,还要保存次小的元素,以此类推,每一次比较的最小结果都要保存。 为此: 1)新建一个辅助栈保存每次进栈的最小元素 2)出栈时,同时把辅助栈顶返回即...原创 2019-02-07 12:58:22 · 169 阅读 · 0 评论 -
两个队列实现一个栈
问题:队列1 队列2;构建一个栈 参考:https://blog.csdn.net/sassaaa/article/details/72719357 思路: 需要明确栈为:先进后出 队列为:先进先出 1)push abc进队列1 2)从队列1的ab出到队列2,再将队列1的c出队列 3)下一次,再执行pop时;将队列2的a出到队列1,将队列2的b出队列 4)如此循环执行123步...原创 2019-02-07 11:14:24 · 225 阅读 · 0 评论 -
27.用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解法: 思路: 1)一个栈负责压栈 2)压入栈1的数出栈到栈2中 3)栈2负责出栈 class Solution { public: void push(int node) { stack1.push(node); } int pop...原创 2019-02-07 10:21:35 · 185 阅读 · 0 评论 -
数据结构之队列
队列(queue):只允许在一端进行插入操作,而在另一端进行删除操作的线性表 先进先出结构(first in first out)FIFO 插入的一端称为队尾 删除的一端称为队头 两种存储方式:顺序存储 链式存储 顺序存储 方式1:入队列O(1) 出队列是O(n)的时间复杂度 方式2:另一种考虑出队列的方式:不用全部移动所有元素,也即是队头不一定在下标为0的位置 其中两个指...原创 2019-02-06 23:22:04 · 730 阅读 · 0 评论 -
数据结构之栈
栈:只允许在表尾进行插入和删除的线性表 后进先出(Last In First Out)LIFO结构 (注意:线性表的存储方式分为顺序存储和链式存储) 操作方式: 1)进栈 栈的压入,也称压栈、入栈 push 2)出栈 栈的删除 pop 其中进栈出栈有多种变化方式:例如可以同时入栈123再出栈,也可以单个入再单个出例如入1出1再继续 栈的存储方式: 顺序存储 缺点:...原创 2019-02-06 20:10:45 · 283 阅读 · 0 评论 -
9.删除链表中的重复结点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) ...原创 2019-01-30 10:15:41 · 197 阅读 · 0 评论 -
33.矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 可以从第n-1到一步到n,这样的话有多少种方案覆盖到n-1就有多少种方案覆盖到n,另外我们也可以从n-2覆盖到n,有多少种方案覆盖到n-2就有多少种方案覆盖到n.?可以这样认为2*1的矩形有两种可能;1)竖着2*1 2)横着 此时必须是两块2*1...原创 2019-02-08 11:42:55 · 337 阅读 · 0 评论 -
34.二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路: 移位运算:左移,右移 注意负数的移位很特殊 与或非、异或、同或运算 一起考虑! 移位统计每位为1的个数,但是怎么移位? 解法1、右移出现的问题是:对于负数的右移会进入死循环,原因是:负数的最高位1需要不变,最终为0xFFFFFFFF 解法2、将1左移分别和输入的整数判断,但问题是:1需要左移3...原创 2019-02-08 23:46:30 · 226 阅读 · 0 评论 -
35.数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方 思路: 1)判断输入的数是否正确 底=0且指数小于0 2)判断指数是否为负 3)由指数的大小确定累乘的次数 问题是效率不高,时间复杂度O(n) 解法1: 逐个乘 class Solution { bool invalidInput=fal...原创 2019-02-10 21:11:36 · 245 阅读 · 0 评论 -
打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999. 解题思路: 1、求出3位数字的最大数,再逐个打印 问题是:不能打印大数,原因是定义的int或者long型有限。 void PrintToMaxOfDigits(int n) { int number = 1; int i = 0; while (i++ < n)...原创 2019-02-11 22:09:33 · 327 阅读 · 0 评论 -
在O(1)时间内删除链表结点(特殊情况)
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下: struct ListNode { int m_nValue;//数据域 ListNode* m_pNext;//指针域 }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 分析: 此题目...原创 2019-02-12 23:57:41 · 312 阅读 · 0 评论 -
LeetCode 167 Two Sum II - Input array is sorted(输入已排序数组,求其中两个数的和等于给定的数)
Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers s...原创 2019-03-05 20:29:04 · 234 阅读 · 0 评论 -
LeetCode 347 Top K Frequent Elements. 前K个高频元素
Given a non-empty array of integers, return thekmost frequent elements. Example 1: Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2] Example 2: Input: nums = [1], k = 1 Output: [1] Note: You...原创 2019-03-06 23:40:01 · 222 阅读 · 0 评论 -
LeetCode 75 Sort Colors 颜色分类(荷兰国旗)
Given an array withnobjects colored red, white or blue, sort themin-placeso that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the in...原创 2019-03-10 13:29:19 · 251 阅读 · 0 评论 -
LeetCode 455. Assign Cookies(分发饼干)
Assume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie. Each child i has a greed factor gi, which is the minimum size of a coo...原创 2019-03-10 17:13:49 · 199 阅读 · 0 评论 -
LeetCode 69. Sqrt(x)--(数组)--二分法查找 --简单
类似博文:LeetCode35. 搜索插入位置 --(数组) 简单(二分法查找)--总结 题目描述 Implementint sqrt(int x). Compute and return the square root ofx, wherexis guaranteed to be a non-negative integer. Since the return typeis a...原创 2019-03-16 19:13:16 · 480 阅读 · 0 评论 -
14.连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...原创 2019-02-01 17:05:05 · 215 阅读 · 0 评论 -
算法复杂度计算-总结
什么是算法 算法时间复杂度的度量 一.事后统计方法 通过设计好的测试程序和数据。利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低 二.事前分析估计方法 在计算机程序编写前,依据统计方法对算法进行评估。 往往考虑的是算法的输入规模!!!也就是说某个算法随着n的增大,它会越来越优于另一个算法或差于另一个算法 例如以下: 时间复杂度...原创 2018-08-05 22:14:31 · 2183 阅读 · 0 评论 -
线性表----顺序存储、单链表、静态链表
整体框架: 余下见下一篇博客:线性表--循环链表、双向链表https://blog.csdn.net/heda3/article/details/83097671 线性表的顺序存储结构 一段地址连续的存储单元依次存储的数据元素 确定3个要素: 一般操作,贯穿整个链表!框架! 初始化线性表 InitList(*L) 1、线性表清空 ClearList...原创 2018-08-05 23:30:36 · 488 阅读 · 0 评论 -
线性表--循环链表、双向链表
上一篇提到的单链表是否能从一个结点出发访问链表的全部结点? 上一篇见:线性表----顺序存储、单链表、静态链表https://blog.csdn.net/heda3/article/details/81437052 答案:不能 1.为此引出循环链表(单循环链表circular linked list),相比于单链表的区别是将单链表的头尾相连接即可。 两种类型:头指针和尾指针 尾...原创 2018-10-16 21:33:11 · 453 阅读 · 0 评论 -
牛客编程2:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ ...原创 2018-11-04 22:38:20 · 606 阅读 · 0 评论 -
数据结构路线汇总
1、把常用的基础算法弄清 2、数据结构弄清 3、解决实际问题的复杂数据结构 金字塔结构、杨辉三角、输出素数、输出质数、石头剪刀布游戏等小问题 排序算法实现 查找算法 用到了什么数据结构 :基本结构循环还是链表、队列、栈、字符串、图等 英文单词输入查找 数据结构路线: 大话数据结构+牛客+剑指+leetcode 总结的不错:https://blog.csdn.net/...原创 2019-01-04 23:17:12 · 509 阅读 · 0 评论 -
4.输入一个链表,反转链表后,输出新链表的表头
题目描述 输入一个链表,反转链表后,输出新链表的表头。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ 通过的代码: 修改链表的结构 /* struct ListNode { int val; struct ListN...原创 2019-01-18 23:08:07 · 1315 阅读 · 0 评论 -
5.输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ...原创 2019-01-20 23:07:01 · 291 阅读 · 0 评论 -
6.复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) /* struct RandomListNode { int label; struct RandomListNode *next, *rando...原创 2019-01-26 23:44:36 · 150 阅读 · 0 评论 -
1、 在一个排序的二维数组中,查找某个整数
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解法一: 使用二分法查找实现 class Solution { public: bool Find(int target, vector<vector<int> > a...原创 2018-07-13 22:39:40 · 458 阅读 · 0 评论 -
10.替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解法1: class Solution { public: void replaceSpace(char *str,int length) { int flag1=0,flag2=0; for...原创 2019-01-31 22:38:43 · 235 阅读 · 0 评论
分享