
数据结构算法
yyyyyyyuande
这个作者很懒,什么都没留下…
展开
-
二叉树遍历算法的六种c语言实现 递归与非递归
二叉树遍历分为三种: 先序遍历:先访问根结点,其次左节点,最后右节点 中序遍历:先访问左结点,其次跟节点,最后右节点 后序遍历:先访问左结点,其次右节点,最后根节点三种遍历的递归算法实现形式类似,仅仅是访问顺序不同,非常简洁。如下://节点定义typedef struct node { int val; struct node *left; struct no...原创 2019-10-30 17:29:17 · 1303 阅读 · 0 评论 -
《剑指offer》c++版本 4.二维数组中的查找
如题:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。非常有趣的一题。题目意思就是从数组中查找指定的数,普通的暴力法,循环遍历数组,可以求取答案,但是效率太低,没有利用题目给的条件。从左到右递增,从上到下递增,如果从左上角[0][0]点开始...原创 2019-10-30 17:27:19 · 298 阅读 · 0 评论 -
《剑指offer》c++版本 7.重建二叉树
如题:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。根据前序和中序数列重建二叉树,这道题,还有一道类似题,根据后续和中序数列重建二叉树。两题解法完全一样,仅仅方向不同。这是学习二叉树的时候必做...原创 2019-10-30 17:27:40 · 271 阅读 · 0 评论 -
《剑指offer》c++版本 6.从尾到头打印链表
如题:题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。刚到手,想到的是反转链表,然后顺序打印。不过这样会改变原有链表。不过这道题最好的解法是利用递归或者栈,一样的道理。遍历链表,从尾到头,听起来和栈的元素访问顺序一致。因此,可以遍历链表,元素入栈,然后再出栈访问即可。此为方法1.方法2是使用递归,先访问下一个元素,再访问自身。值得注意的是,凡是递归写法,一般都...原创 2019-10-30 17:27:37 · 325 阅读 · 0 评论 -
《剑指offer》c++版本 3.数组中重复的数字
如题:题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。方法由很多,四种,显然,排序法和哈希查找法都可以。第三种方法比较巧妙,利用了题目中数字都在0~n-1这个...原创 2019-10-30 17:27:01 · 315 阅读 · 0 评论 -
leetcode 236. 二叉树的最近公共祖先 递归解法 c语言
如题:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root =[3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root...原创 2019-10-30 17:26:15 · 1966 阅读 · 2 评论 -
leetcode 136. 只出现一次的数字 c语言
题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4这道题如果没有时间复杂度或者空间复杂度,的确不复杂,通过对数组排序后,两两比较,如果存在不等,返回即...原创 2019-10-30 17:24:57 · 546 阅读 · 0 评论 -
leetcode 703. 数据流中的第K大元素 最小堆解法 c语言
如题:设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。你的KthLargest类需要一个同时接收整数k 和整数数组nums的构造器,它包含数据流中的初始元素。每次调用KthLargest.add,返回当前数据流中第K大的元素。示例:int k = 3;int[] arr = [4,5,8,2];KthLargest k...原创 2019-10-30 17:25:42 · 612 阅读 · 0 评论 -
leetcode 105. 从前序与中序遍历序列构造二叉树 c语言递归解法
如题:根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder =[3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7套路题,考察你有没有学习过这种题型。同样的问题还有知道中序与后序构造...原创 2019-10-30 17:26:08 · 746 阅读 · 0 评论 -
leetcode 106. 从中序与后序遍历序列构造二叉树 c语言递归解法
如题:根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder =[9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7这道题明显是有套路的,如果你还不会,说明你是第一次遇到,还好现在...原创 2019-10-30 17:31:09 · 1335 阅读 · 0 评论 -
leetcode 450. 删除二叉搜索树中的节点 c语言实现
如题:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。说明: 要求算法时间复杂度为 O(h),h 为树的高度。示例:root = [5,3,6,2,4,null,7]key = ...原创 2019-10-30 17:31:15 · 766 阅读 · 0 评论 -
《剑指offer》c++版本 5.替换空格
如题:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。这道题难度不大,替换空格,字符串长度边长,需要知道变多长,这时候需要统计空格个数。知道最终字符串长度后,将源字符串从后往前复制到新字符串对应位置即可。编码的时候需要检查输入参数是否合法。//计算str长度,然后统计空...原创 2019-10-30 17:27:25 · 283 阅读 · 0 评论 -
《剑指offer》c++版本 8.二叉树的下一个结点
如题:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。这道题目考察对二叉树中序遍历的理解,做题的时候,如果没有思路,简单画画图,可以帮助理解。上图没有画出指向父节点的指针,不过,不妨碍分析问题。已知节点,求中序遍历后一个节点。如果节点存在右子树,显然,后一个节点位于右子树上最左边位置,递归...原创 2019-10-30 17:35:44 · 313 阅读 · 0 评论 -
《剑指offer》c++版本 9. 用两个栈来实现一个队列
如题:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。本题考察对数据结构队列,栈的理解。队列的特点是FIFO,先进先出。栈的特点是FILO,先进后出。题目要求我们使用两个栈来实现队列的操作,一开始不懂没关系,可以模拟下入队、出队的动作。假设,先入队1,2两个元素,存储到stack1,栈顶为2,这时候要出栈,按照队列规则,应该1先出,怎么办呢?很明显...原创 2019-10-30 17:27:45 · 274 阅读 · 0 评论 -
《剑指offer》c++版本 18.删除链表的结点
如题:这道题要求在O(1)时间内删除链表节点。常规解法是遍历链表,找到所需元素,使其前继节点的next指针指向待删节点的next指针,时间复杂度位O(n),不满足要求。除了遍历之外,还有一种更好的办法删除结点,如果结点存在后继元素的话,可以直接将后继元素所有值复制到待删元素,这时候直接删除后继即可,如果位于尾节点,则遍历链表,对于链表中只有一个元素的情况,这时候,待删结点即是头节点又是...原创 2019-10-30 17:28:48 · 295 阅读 · 0 评论 -
《剑指offer》c++版本 17.打印从1到最大的N位数
如题:题意就是从1打印直到n位数的最大值,即999999999........。一看就是循环的逻辑。需要注意的地方,除了非法的n之外,就是大数问题了。n太大的话,啥类型都存储不了。普通的解法是使用一个长度为n的字符数组,然后循环对数组做加1操作,然后打印。逻辑不难,但这题有更好的解法。打印1到9999...,相当于打印N位数的全排列,这里用N层循环即可,无需处理加1操作,逻辑上更简单。...原创 2019-10-30 17:28:39 · 383 阅读 · 0 评论 -
《剑指offer》c++版本 16.数值的整数次方
如题:题目要求一个数的N次方,且不需要考虑大数,看似简单,for循环搞定。仔细详细,问题还挺多。比如,base为0或者指数为负,同时浮点数和0比较也是个问题。很多时候,面试官出的题目看似简单,但如果不加考虑,直接上手就写代码,很容易出现遗漏现象,在面试这种场合,很容易给面试官留下水平低下的映像,面试本来就是一次性的发挥,所以务必小心谨慎,拿到题目想到方案后,一定要考虑各种边界情况以及异常输...原创 2019-10-30 17:28:34 · 485 阅读 · 0 评论 -
《剑指offer》c++版本 15.二进制中1的个数
如题:平常开发过程中,遇到求数的每位数字的时候,通常做法是将这个逐位右移,本题目计算整数的二进制中1的个数,通过右移的方式,能够解决部分问题,但是,这里有个坑,如果整数为负的话,右移后最左边还是1,如果是循环的话,容易引起死循环。举个例子:负数0x80000000,右移后不是0x40000000,而是0xC0000000,这是因为,移位后,仍要保证是负数,一直右移,最终得到0XFFFFFFFF...原创 2019-10-30 17:28:28 · 261 阅读 · 0 评论 -
《剑指offer》c++版本 14.剪绳子
本题在牛客网剑指offer专项里没看到,原书第二版上有,如题:这道题是开放的动态规划题,题目中只给了绳子长度,却没定义具体剪多少段,初遇此题,难以下手,看了题解,豁然开朗。设f(n)为常为n的绳子剪成m段之后可得最大值,则存在n-1中减法,得f(n) = MAX(f(i) * f(n-i));初始值f(1),f(2),f(3)都可以计算出来,大于3则调用dp方程递归计算至n即可。思路简...原创 2019-10-30 17:31:03 · 424 阅读 · 0 评论 -
《剑指offer》c++版本 13. 机器人的运动范围
如题:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?这道题和第12题矩阵中的路径类似,都...原创 2019-10-30 17:28:10 · 390 阅读 · 0 评论 -
《剑指offer》c++版本 12. 矩阵中的路径
如题,牛客网上题目没有图示,下图是从原书中截图得到的。本题就是从数组中按照指定方向查找字符序列,典型的回溯行为,找到当前字符,继续查找该字符上下左右四个方向,找不到,返回上一个字符,重新查找。题目要求,路径中不能访问同一个字符,可以创建一个等大小的bool二维数组,记录已访问的点,每次访问一个点,置标志位,注意。如果该点的后一个结点不符合,再返回上一个节点前,需要去掉该标志位。使用递归...原创 2019-10-30 17:28:04 · 468 阅读 · 0 评论 -
《剑指offer》c++版本 11. 旋转数组的最小数字
如题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题意就是数组中查找最小值,最直接的方法就是排序后得到最小值,但是题目已经指明,数组为非递减数组。有序数组查...原创 2019-10-30 17:27:56 · 366 阅读 · 0 评论 -
《剑指offer》c++版本 10. 斐波那契数列
如题:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。这道题基本上学过算法的人都直到,斐波那契数列即,即1,1,2,3,5.......用数学公式描述即 f(n) = f(n-1) + f(n-2),很多教科书上都提供了递归算法,虽然,能够满足,但是效率是在太低了,存在大量重复计算,比如,计算f(5)的时候,需要计算f(4)和f(...原创 2019-10-30 17:27:51 · 285 阅读 · 1 评论 -
leetcode 101. 对称二叉树 递归解法 c语言
如题:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [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这道题刚开始想到的是使用队列+BFS,因为...原创 2019-10-30 17:26:04 · 515 阅读 · 0 评论 -
leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
如题:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例1:输入: 2 / \ 1 3输出: true示例2:输入: 5 / \ 1 4 / \ 3 6...原创 2019-10-30 17:25:15 · 903 阅读 · 0 评论 -
堆排序之 大顶堆和小顶堆 c语言
百度得到的堆定义如下:堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2) 当ki <= k2i的时候,称之为小顶堆,反之则称之为大顶堆。堆排序时间复杂度好坏情况均为n...原创 2019-10-30 17:25:59 · 1578 阅读 · 0 评论 -
归并排序 c代码
唯有的两次面试考察了排序,每次都想写个时间复杂度在O(nlogn)。第一次面试一看到排序想都没想直接开撕快速排序,写到一半快速排序的逻辑忘了,尴尬之余速度整了个冒泡排序替代。第二次面试也有一道排序题,当时想都没想直接开撕归并排序,结果在处理辅助数组的时候把自己给绕晕了,越写越慢,临时整了个冒泡排序替代。( ̄_, ̄ )"。冒泡排序还真是好用,呵呵。平常工作的时候遇到排序问题基本上整个冒泡排序就过去了...原创 2019-10-30 17:21:35 · 304 阅读 · 0 评论 -
动态规划 dp05 插入乘号问题 c代码
先看题目:在一个由n个数字组成的数字串中插入r个乘号(1 <= r < n),将它分成r+1个整数,找出一种乘号的插入方法,使得这r+1个整数的乘积最大。例如,对给定的数串267315682902764如何插入6个乘号,使其乘积最大?插入r个乘号是一个多阶段决策问题,应用动态规划来求解。使用动态规划需要找到状态递推关系,阶段自然就是插入的乘号了。设 f(i, k)...原创 2019-10-30 17:23:11 · 1777 阅读 · 0 评论 -
快速排序 递归版本和非递归方法 c代码
快速排序平均时间是T(n) =knln(n),其中n为待排序序列中记录个数,k为某个常数。通常,快速排序被认为是,在所有同数量级(O(nlogn))的排序方法中,其平均性能最好,但是,若初始记录按关键字有序或者基本有序,快速排序将蜕变为冒泡排序,其时间复杂度为O(n^2)。快速排序听起来挺简单,实现代码看起来也很简单。但简单只是相对而言,如果不理解其思路的话,现场写代码还是有一定难度,因此需要...原创 2019-10-30 17:20:18 · 1073 阅读 · 0 评论 -
冒泡排序 c代码
冒泡排序是不是排序算法的鼻祖呢?应该是。即便是没学过算法的小学生,你让他正序排列一串数字,估计他的思路就是冒泡排序。冒泡排序的时间复杂度为O(n^2),和普通的插入排序一样,要说区别吧,可能是冒泡排序是将数字从后往前插入,插入排序是从前往后插。普通场景下需要排序搞个冒泡就解决了,除非数量级特别大,不然杀鸡焉用牛刀。冒泡排序思想就是数据集中两两比较,找到最大的放到最后,然后重新来一遍,找到次最大...原创 2019-10-30 17:36:07 · 350 阅读 · 0 评论 -
希尔排序(ShellSort) c源码
希尔排序(Shell‘s Sort)其实是一种优化的插入排序,插入排序(insertSort)平均时间复杂度为O(n^2),仅仅比较时间复杂度的话,优于插入排序的还有很多其它排序方法,比如说堆排序或者归并排序。很奇怪为啥现在算法里还介绍插入排序,考虑到它时间复杂度这么大,但书上也说了,如果数据量小的话,插入排序效率还是蛮高的。我觉得最重要一点是插入排序简单,几乎不需要思考就可以写出来。插入排...原创 2019-10-30 17:20:04 · 293 阅读 · 0 评论 -
leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案首先,看懂题目很重要!!!啥是回文?把相同的词汇或句子 [1] ,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。这道题对时间复杂度没有要求,可即便如此,刚开始还是毫无办法 ╮(...原创 2019-10-30 17:21:03 · 889 阅读 · 0 评论 -
简单插入排序,折半插入排序和2路插入排序 c源码
以下三种插入排序时间复杂度均为O(n^2)简单插入排序,简单直接。假定数组有序,插入 i, 从后往前遍历找到适合位置 j,移动 j +1 ~ i -1往后一位,插入i到j中。void insertSort(int *arr, int numsSize){ int i, j, k, v; for (i = 1; i < numsSize; i++) { for (j = ...原创 2019-10-30 17:19:42 · 270 阅读 · 0 评论 -
动态规划 dp00 01背包问题及其扩展 c代码
这几天在学习算法方面动态规划的内容,主要是为了面试。最早接触动态规划是在大学的算法课,当时看书遇到的第一道难题就是01背包问题,自己琢磨了半天也没想出一个好的方法,看课本几行代码就搞定了,感觉特别不可思议,当时觉得算法相当强大,不过也没太花时间在这上边,最近准备大厂面试的时候,发现算法和数据结构的要求相当高,所以开始复习下算法。私以为,卓越的程序员是需要懂得算法的。在阅读内核源码的时候,经常会碰到...原创 2019-10-30 17:22:44 · 1026 阅读 · 0 评论 -
动态规划 dp01 西瓜分堆问题 c代码
先看下题目:已知14个西瓜 的重量,分别为:23 21 12 19 18 25 20 22 16 19 12 15 17 14请将这些瓜分成两堆,每堆的个数不限,使两堆西瓜重量之差最小。我们知道,动态规划类问题是存在明确的步骤的:1. 分阶段。2. 状态迁移方程。3. 求最优解。这道题要把西瓜分成两堆,假设A堆和B堆,对于每个西瓜而言,要么分到A,要么分到B,和01背...原创 2019-10-30 17:35:59 · 2367 阅读 · 0 评论 -
动态规划 dp02 最长非降子序列问题 c代码
先看下题目:给定一个由n个正整数组成的序列,从该序列中删除若干个整数,使剩下的整数组成非降子序列,求最长的非降子序列。例如,由12个正整数组成的序列为: 48,16,45,47,52,46,36,28,46,69,14,42请在序列中删除若干项,使剩下的项为非降(即后面的项不小于前面的项)序列,剩下的非降序列最多为多少项?这道题第一次做是会做的,刷了两天动态规划类题目,第...原创 2019-10-30 17:22:49 · 1688 阅读 · 1 评论 -
leetcode 454. 四数相加 II c语言
如题:给定四个包含整数的数组列表A , B , C , D ,计算有多少个元组 (i, j, k, l),使得A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过231 - 1 。例如:输入:A ...原创 2019-10-30 17:25:09 · 642 阅读 · 0 评论 -
leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码
如题:根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用0 来代替。例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是[1, 30000...原创 2019-10-30 17:24:51 · 682 阅读 · 0 评论 -
leetcode 279. 完全平方数 bfs广度优先解法 图解 动态规划解法 c代码
如题:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例1:输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.这道题和leetcode 752. 打开转盘锁类似,都可以使用广度优先搜索...原创 2019-10-30 17:24:42 · 839 阅读 · 0 评论 -
leetcode 752. 打开转盘锁 c代码
先看题目:你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组...原创 2019-10-30 17:24:13 · 784 阅读 · 0 评论