牛客网刷题
孤独的拉普拉斯
菜鸟级程序员
展开
-
之字形打印二叉树
思路:首先我们需要逐层打印二叉树,然后根据每一层的状态判定是从左到右,还是从右到左。首先问题的核心其实是从上到下,从左到右打印二叉树,只不过后面题目多了两个要求,所以我们2代码的大体框架应该是基于从上到下打印二叉树;其次逐层打印二叉树,实际上就是让我们对每一层设置标志位,然后根据标志位去决定打印的情况;最后之字形,其实还是根据标志位去决定正序,还是逆序打印;分析,完毕,参考代码如下:/*struct TreeNode { int val; struct TreeNode *left;原创 2020-06-22 14:47:45 · 333 阅读 · 0 评论 -
旋转数字的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析:题目定义了何为旋转数组,并且用例子告诉了我们输入的数组旋转前是非递减。所以由此我们可以获得以下信息:1.非递减数列意味着数列有序;2.旋转数组后,整个有序数组变为了两个有序数组(则数组相邻处存在跳变,如例子原创 2020-05-18 16:50:31 · 169 阅读 · 0 评论 -
重构二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析:给了我们一颗二叉树的前序遍历和中序遍历,则我们根据两个遍历的遍历方式来思考如何重构。已知preorder:VLR,inorder:LVR。所以,很显然,preorder可以找到树的根节点,而有了根节点再看inorder,我们就能够清楚根节点的左子树inorder序列,原创 2020-05-18 10:46:23 · 234 阅读 · 0 评论 -
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M热度指数:1348087分析:从头到尾的顺序返回一个链表,首先我们立即思考到可以使用栈的结构或者和栈思想一致的递归,前者需要额外的空间,而后者则需要注意链表过长导致的运行时栈的溢出。带着这个思路我们看题发现题目已经定义了链表节点结构,并且指定了反转算法的返回值只能为vector。于是乎,既然不得不用vector,则我们只需要用vector完成栈功能即可。代码如下class Solution {public:原创 2020-05-15 17:24:07 · 116 阅读 · 0 评论