
数据结构算法
数据结构相关的知识点及题解
heda3
拥有超过10年的嵌入式开发经验,新一代信息技术工程师/人工智能博士,已申请发明专利15项,其中8项成功获批授权,并在中英文期刊上发表多篇高水平学术论文。在嵌入式系统、算法开发与技术管理领域,积累了丰富的实践经验,并持续在技术社区分享在嵌入式驱动、操作系统、上位机软件、算法优化等开发过程中遇到的关键问题、创新解决方案以及深刻的技术洞察。持续跟随行业前沿,探索嵌入式开发中的最新动态与突破性技术,共同推动技术进步与创新!
展开
-
查找-之散列表/哈希表
问题:前面的查找不可避免的要进行比较,是否能直接通过关键字key得到要查找的元素位置?解决方法:散列技术通过记录的存储位置和关键字建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)f为散列函数/哈希函数散列表/哈希表(Hash table)--采用散列技术实现数据存储的一块连续的存储空间散列过程:1)存储时,散列函数计算数据的散列地址,并...原创 2020-02-04 23:34:10 · 388 阅读 · 0 评论 -
查找-之多路查找树
二叉排序树或平衡二叉树(AVL树、红黑树)查找-之二叉排序树(查找、插入、删除)查找-之平衡二叉树AVL和红黑树结点只有两个孩子,且结点只能存储一个元素问题:一个结点只存储1个元素,在元素很多时,使得树的深度或高度很大 出现的问题是:内存存取外存的次数非常多-使得时间效率降低解决方法:2-3树结构:1970年 约翰·霍普克洛夫发明的多路查找...原创 2020-02-04 20:33:30 · 356 阅读 · 0 评论 -
查找-之平衡二叉树AVL和红黑树
在上一篇文章查找-之二叉排序树(查找、插入、删除)引出的问题是:二叉排序树的存在的不足是插入新结点导致树不平衡,不平衡树使得查找性能下降解决方法构建平衡的二叉树AVL树、红黑树AVL树:带有严格平衡条件的二叉查找树,用平衡因子差值判断树是否平衡并通过旋转实现平衡,左右子树的高度不超过1适用于:插入和删除次数较少(插入删除操作使得树失去平衡,为维持严格平衡旋转操作,使得性...原创 2020-02-04 18:11:39 · 347 阅读 · 0 评论 -
查找-之二叉排序树(查找、插入、删除)
问题:有序的线性表采用:折半/二分、插值、斐波那契查找相比顺序查找效率得到提高,但是在插入和删除时效率低(为维持数据的有序性)在高效实现查找操作时,如何提高插入和删除的效率?在一些应用场景:在查找时需要插入和删除解决方法:二叉排序树二叉排序树特点1)若左子树不为空,左子树上所有结点的值均小于或等于它的根节点的值2)若右子树不为空,右子树上所有结点的值均大于...原创 2020-02-04 17:22:39 · 3264 阅读 · 0 评论 -
查找-之线性索引查找
针对场景:博客网站论坛的帖子回复、服务器日志记录数据量大,每条记录无法做到有序排列记录解决方法:索引---把关键字和它对应的记录相关联的过程索引分类:线性索引、树形索引、多级索引线性索引:将索引项集合组织为线性结构---索引表线性索引包括:稠密索引、分块索引、倒排索引稠密索引结构:索引项---对应---记录索引项是有序的、记录数据表可以是无序的...原创 2020-02-04 16:50:10 · 361 阅读 · 0 评论 -
查找-之有序表查找
待查找的表是有序排列的解决的方法1:折半查找/二分法查找其中线性表采用的是顺序存储//Cint 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 · 316 阅读 · 0 评论 -
查找-之顺序表查找-(数据的排列无序)
查找--摘要静态查找表:只做查找操作的查找表动态查找表:在查找过程中还做插入和删除数据元素的操作查找时可改变数据元素之间的关系以获得较高的查找性能,将查找集合组织成表、树结构。也即是从数据的存储方式作出改进。还有从算法层面做出改进:二分、插值、斐波那契查找等顺序查找:线性查找,从表的第一个逐个开始和待查找元素比较,直到最后一个(暴力破解)//C//a为待查数...原创 2020-02-01 11:55:02 · 1177 阅读 · 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 · 185 阅读 · 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 · 143 阅读 · 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 · 257 阅读 · 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 · 328 阅读 · 0 评论 -
29、栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路:入栈的顺序如第一个序列。栈的弹出顺序有多种。让弹出栈的元素和...原创 2019-02-07 16:49:48 · 162 阅读 · 0 评论 -
28.包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。分析问题:1、新建一个暂存变量存储最小值,但是当把栈中的最小的元素出栈后,剩下的栈中的最小元素将不知道2、除了最小元素保存,还要保存次小的元素,以此类推,每一次比较的最小结果都要保存。为此:1)新建一个辅助栈保存每次进栈的最小元素2)出栈时,同时把辅助栈顶返回即...原创 2019-02-07 12:58:22 · 135 阅读 · 0 评论 -
两个队列实现一个栈
问题:队列1 队列2;构建一个栈参考:https://blog.youkuaiyun.com/sassaaa/article/details/72719357思路:需要明确栈为:先进后出 队列为:先进先出1)push abc进队列12)从队列1的ab出到队列2,再将队列1的c出队列3)下一次,再执行pop时;将队列2的a出到队列1,将队列2的b出队列4)如此循环执行123步...原创 2019-02-07 11:14:24 · 185 阅读 · 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 · 136 阅读 · 0 评论 -
数据结构之队列
队列(queue):只允许在一端进行插入操作,而在另一端进行删除操作的线性表 先进先出结构(first in first out)FIFO插入的一端称为队尾 删除的一端称为队头两种存储方式:顺序存储 链式存储顺序存储方式1:入队列O(1) 出队列是O(n)的时间复杂度方式2:另一种考虑出队列的方式:不用全部移动所有元素,也即是队头不一定在下标为0的位置其中两个指...原创 2019-02-06 23:22:04 · 650 阅读 · 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 · 156 阅读 · 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 · 156 阅读 · 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 · 266 阅读 · 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 · 390 阅读 · 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 · 138 阅读 · 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 · 198 阅读 · 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 = 2Output: [1,2]Example 2:Input: nums = [1], k = 1Output: [1]Note:You...原创 2019-03-06 23:40:01 · 177 阅读 · 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 · 199 阅读 · 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 · 260 阅读 · 0 评论 -
35.数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方思路:1)判断输入的数是否正确 底=0且指数小于02)判断指数是否为负3)由指数的大小确定累乘的次数问题是效率不高,时间复杂度O(n)解法1:逐个乘 class Solution { bool invalidInput=fal...原创 2019-02-10 21:11:36 · 194 阅读 · 0 评论 -
34.二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:移位运算:左移,右移 注意负数的移位很特殊与或非、异或、同或运算一起考虑!移位统计每位为1的个数,但是怎么移位?解法1、右移出现的问题是:对于负数的右移会进入死循环,原因是:负数的最高位1需要不变,最终为0xFFFFFFFF解法2、将1左移分别和输入的整数判断,但问题是:1需要左移3...原创 2019-02-08 23:46:30 · 169 阅读 · 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 · 188 阅读 · 0 评论 -
数据结构之栈
栈:只允许在表尾进行插入和删除的线性表 后进先出(Last In First Out)LIFO结构(注意:线性表的存储方式分为顺序存储和链式存储)操作方式:1)进栈栈的压入,也称压栈、入栈 push2)出栈栈的删除 pop其中进栈出栈有多种变化方式:例如可以同时入栈123再出栈,也可以单个入再单个出例如入1出1再继续栈的存储方式:顺序存储缺点:...原创 2019-02-06 20:10:45 · 211 阅读 · 0 评论 -
26.字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。解法:哈希表实现类似上一篇文章:25.第一次只出现一次的字符https://blog.csdn.n...原创 2019-02-06 09:58:10 · 183 阅读 · 0 评论 -
13.数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法1:需要O(n)时间,(剑指解法2)1)它比较的是两两相临近的的数组是否相等,相等则计数1,同时参与比较的这个数num保持不变参与下一次的比较;2)否则计数为...原创 2019-02-01 12:45:02 · 135 阅读 · 0 评论 -
12.调整数组顺序,使得奇数在前,偶数在后
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解法1:创建一个新数组保存偶数;删除原数组中对应的偶数位置;新数组放在原数组的后面class Solution{public: void reOrderArray(vector<int>...原创 2019-02-01 09:55:10 · 793 阅读 · 0 评论 -
11.旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解法一:使用二分查找实现分为两部分:前一个递增子数组 后一个递增子数组 ;两个指针分别指向第...原创 2019-01-31 23:50:01 · 187 阅读 · 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 · 187 阅读 · 0 评论 -
1、 在一个排序的二维数组中,查找某个整数
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解法一:使用二分法查找实现class Solution{ public: bool Find(int target, vector<vector<int> > a...原创 2018-07-13 22:39:40 · 407 阅读 · 0 评论 -
6.复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)/*struct RandomListNode { int label; struct RandomListNode *next, *rando...原创 2019-01-26 23:44:36 · 115 阅读 · 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 · 239 阅读 · 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 · 1254 阅读 · 0 评论 -
数据结构路线汇总
1、把常用的基础算法弄清2、数据结构弄清3、解决实际问题的复杂数据结构 金字塔结构、杨辉三角、输出素数、输出质数、石头剪刀布游戏等小问题排序算法实现查找算法用到了什么数据结构 :基本结构循环还是链表、队列、栈、字符串、图等英文单词输入查找数据结构路线:大话数据结构+牛客+剑指+leetcode总结的不错:https://blog.youkuaiyun.com/...原创 2019-01-04 23:17:12 · 473 阅读 · 0 评论 -
牛客编程2:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) { * }* };*/...原创 2018-11-04 22:38:20 · 537 阅读 · 0 评论