牛客刷题
cozy的小丑鱼
菜鸟一个,慢慢进步。
展开
-
牛客刷题——找零最少
题目:给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。eg:输入:[5,2,3],20 ,输出:4动归是硬伤啊,还是不会做。思路应该是对的,针对已有的面值,对前面的每个状态 j 进行计算,但是动归方程到底啥时候用一维啥时候用二维啊....首先将所有的元素初始化为 Integer.MAX_VALUE-1,然后将 dp[0] 置为0,因为当找零为0时,所需要的数量为0,...原创 2021-03-24 10:35:17 · 524 阅读 · 1 评论 -
牛客刷题——01背包
题目:01背包,求最大价值eg:输入:10,2,[[1,3],[10,4]]。输出:401背包都不会写了。。。。还是动归不大熟练啊刚开始还是按照贪心的思想去做了,根据单位价值对数据进行了排序,但是还是没有想出怎么解决。因为没有想出动归的思想。动归其实可以理解成将问题扩展了,想求当前状态,那么就要去考虑前面有哪些可能的状态,从一件物品开始,从背包容量为1⃣️开始,这样的话就可以构成出一个一个二位的数组,然后计算数组的每个元素,数组的右下角就是最终的结果。以上述例子为例:物品件数/背.原创 2021-03-23 21:34:44 · 247 阅读 · 0 评论 -
牛客刷题——合并二叉树
题目:已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:两颗二叉树是:Tree 1 1 / \ 3 2 / 5 Tree 2 2 / \1 3 \ \ 4 7合并后的树为 3 / \ 4 5/ \ \5 4 7Holy shit!一道简单的题目被我搞得巨复杂。。...原创 2021-03-23 10:35:02 · 423 阅读 · 0 评论 -
牛客刷题——单调栈
题目:给定一个可能含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。位置信息包括:两个数字 L 和 R,如果不存在,则值为 -1,下标从 0 开始。eg:输入:[3,4,1,5,6,2,7] 输出:[[-1,2],[0,2],[-1,-1],[2,5],[3,5],[2,-1],[5,-1]]看完题目想的还是暴力,没有想出如何使用栈来解决。。。本着不辜负题目用意的想法,看了答案解析,还是有很多人直接用暴力,看了使用...原创 2021-03-22 20:19:42 · 308 阅读 · 0 评论 -
牛客刷题——最大公约数
题目:最大公约数oh,暴力通不过,在看解析的时候看到一个一行的解法。。。。。完整代码如下: public int gcd (int a, int b) { // write code here return (a%b==0)?b:gcd(b, a%b); }原创 2021-03-22 11:38:37 · 151 阅读 · 0 评论 -
牛客刷题——牛牛的数列
题目:牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。eg:输入:[7,2,3,1,5,6],输出:5自己的思路是第一次遇到“断口”(导致不是上升子序列的位置)时先忽略,等到第二次遇到断口,那么前面这段数字就构成了一个符合条件的序列,奈何用例只通过了一部分,也不知道是什么原因。。。然后看了答案解析,整体思路是首先计算出每个元素作为起始元素.原创 2021-03-17 11:36:09 · 1594 阅读 · 3 评论 -
牛客刷题——进制转换
题目:给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数题目其实还算简单,但是自己还是陷入了思维误区。。。。本来想休息一段时间再做,但还是感觉得坚持着做,做不出来的就看别人的解法整理一下思路,毕竟题目时间少。进制转换,乍一看还是比较简单的,做的时候出现了两个问题:1. 没有考虑符号;2. 写成了10进制转2进制的代码。。首先整体的思路还是,先取模确定余数 M%N,然后根据于余数确定当前进制对应的数字,然后对 M/N,来进行下一位的运算,注意这里应该后计算的加到最..原创 2021-03-11 10:33:10 · 195 阅读 · 0 评论 -
牛客刷题——字符串中第一个只出现一次的字符位置
题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)eg: 输入:"google" 输出:4是道简单难度的题,但是自己缺绕进了死循环,写完这个题准备先换换脑子,看看面试题目啥的,等这阵疲劳过了再回来做。。。当时也是考虑的有个计数,然后第一个计数为 1 的肯定就是要找的字符,返回其下标即可,也用了 map 进行存储,但是在最后查找为 1 的过程...原创 2021-03-08 10:49:07 · 230 阅读 · 0 评论 -
牛客刷题——字符串变形
题目:对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如"Hello World"变形后就变成了"wORLD hELLO"。请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。一道简单难度的题,硬是给做成了中等难度的题。最大的误区在于使用了 split 方法进行了分割,这样导致空格的位置不确定,..原创 2021-03-06 12:03:09 · 610 阅读 · 0 评论 -
牛客刷题——二叉搜索树第k小的结点
题目:给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。思路都知道但是写不出来是什么原因,早上鸡蛋吃傻了?二叉搜索树的,中序遍历一遍就是排序后的,中序遍历的第 k 个节点就是结果啊。说是这么说,咋写啊。首先想一下中序遍历的过程,首先是遍历左子树,处理当前节点,然后遍历右子树,使用全局变量 index 来记录达到的节点个数。1. 递归的条件仍然是当前节点不是空节点,否则返回 null;2. 首先对左子树进行处理,对左子树进行递归遍历,如果左子树的返回值不为 null ,那么.原创 2021-03-06 10:56:25 · 232 阅读 · 0 评论 -
牛客刷题——判断二叉树中是否存在路径和为sum的路径
题目:给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径,例如:给出如下的二叉树,sum=22,返回true,因为存在一条路径5→4→11→2的节点值之和为 22这题虽然是个简单题,但是还是记录一下,毕竟涉及到递归的一些思想。首先这道题是判断是否存在,所以将是否存在定义为了一个全局变量,当变量的值变为 true 的时候,就说明存在了。然后是使用 sum 来作为判断是否存在的标准,每到达一个节点,判断当前节点不为空的话,就 sum -= ro...原创 2021-03-06 09:38:10 · 285 阅读 · 0 评论 -
牛客刷题——判断二叉树是不是完全二叉树和二叉搜索树
题目:给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。这道题目实际上就是两个问题的简单组合,直接使用两个函数分别去判断一下即可。首先说一下二叉搜索树的判断,根据二叉搜索树的规则,左孩子 < 根节点< 右孩子。所以只需要从上往下进行判断,是否符合这个规律,一旦不符合就 return false,否则去判断左右子树是不是也符合这个规律。完全二叉树的话,是除了最后一层,其他的层都不会出现空节点。利用这个性质的话,对树进行层次遍历,一旦遇到空节...原创 2021-03-05 21:36:11 · 180 阅读 · 0 评论 -
牛客刷题——二叉树的最大路径和
题目:给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。这个路径的开始节点和结束节点可以是二叉树中的任意节点例如:给出以下的二叉树,返回的结果为6(2+1+3)太强了太强了,大佬就是大佬。。。。自己写了半天,代码一行又一行也没啥结果,人家几行就解决了。。。直接看递归函数,我在处理的时候一直有个问题就是,在计算过程中进行累加 sum ,然后动态的去更新 max 的值,但是初始化的时候,不知道该怎么初始化 sum,如果初始化 0 ,当树中结点都为负数的时候,答案肯定不对,如果初..原创 2021-03-05 20:20:04 · 284 阅读 · 0 评论 -
牛客刷题——二叉树路径和为sum的路径
题目:给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum的路径,例如:给出如下的二叉树,sum=22sum=22,返回[[5,4,11,2],[5,8,9]]确认了,二叉树的问题确实是算法上比较容易做出的问题,因为基本离不开树的遍历。。。这道题目的思路还是比较清楚的,先序遍历,累加,记录路径,到达根节点进行比较,累加和等于 sum 的话,将该路径保存起来,否则丢弃。但是有个需要注意的点,由于这道题目是多解的,在进行遍历的过程中可能有多...原创 2021-03-05 15:22:26 · 466 阅读 · 0 评论 -
牛客刷题——盛水的容器
题目:给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。eg : 输入:[3,1,2,5,2,4],输出:5太笨了太笨了,做过一遍了还不会。这道题目陷入的误区是想着先确定容器,确定了之后再计算容量,但是。。。也不知道是啥原因,最后一个用例过不了,只能参考答案。其实可以动态的确定容器和更新容器。首先使用双指针,left 和 right 分别指向数组的两端,然后使用lMax记录左容器的高度,使用rMax记录右容器的高度,然后对整个数组进行..原创 2021-03-04 16:07:22 · 221 阅读 · 1 评论 -
牛客刷题——判断二叉树是否为镜像
题目:给定一棵二叉树,判断琪是否是自身的镜像(即:是否对称)例如:下面这棵二叉树是对称的 1 / \ 2 2/ \ / \3 4 4 3下面这棵二叉树不对称。 1 / \ 2 2 \ \ 3 3太蠢了太蠢了,陷入了思维死角,可能因为一般的题目都涉及二叉树的各种遍历,这道题目在思考的时候也想着通过递归遍历来处理,但是想了半天总感觉找不到这个条件,又想着直接层序遍历,每层判断,但是这种方法更蠢,唉。。...原创 2021-03-01 10:17:33 · 895 阅读 · 0 评论 -
牛客刷题——数组中和为0的三元组
题目:给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 解集中不能包含重复的三元组。这道题,我是想着直接用暴力求解,三重循环。。。结果答案对比是一样的,这个测试就是不给我通过,就很奇怪,然后就去看了其他人的题解,使用的是双指针,整体思想是把三数和为0转换为两数和为0 ,还是有几个需要注意的点的。首先为了方便处理,先将数组进行排序,(以后类似的题目都要注意,对顺序.原创 2021-02-28 16:41:38 · 379 阅读 · 0 评论 -
牛客刷题——最长上升子序列
题目:给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)eg: 输入:[2,1,5,3,6,4,8,9,7]输出:[1,3,4,8,9]这题好不容易写出了动归,结果超时了。。。。难过说一下另一种解法,还是看别人的代码理解了很久。贪心+二分。首先在动归中有一个操作,是查找当前元素位置之前,第一个小于当前元素的值,正是这个查询操作导致动归解法的时间复杂度变成了,所以这里用二分查找来实现以减少时间复杂度。(动归+二分应该也是可以?我没有尝试,.原创 2021-02-28 11:05:02 · 376 阅读 · 0 评论 -
牛客刷题——判断链表是否为回文结构
题目:给定一个链表,请判断该链表是否为回文结构。这个题目不难,但是有几个需要注意的地方。1. 链表是否为回文结构,是将链表中的元素看作一个整体,不需要对链表中节点内部的值排列进行比较。eg:12->13->13->12,构成回文结构,而不是考虑回文字符串那样按位比较;2.如果采用List等数据结构,先将链表中的值提取出来再进行判断,则需要注意,判读值相等应该用equals方法,不能再用==,因为此时数据已经是Integer类型的对象了;3.这题有较多的解法,1)List.原创 2021-02-27 10:13:35 · 250 阅读 · 0 评论 -
牛客刷题——字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。eg:输入:"ab"输出:["ab","ba"]这道题知识点打了个动归。。。。给我整迷了,之前做过全排列的题目,想着是递归,两次swap,但是具体的细节不记得了,而且这题是包含重复字符,以及要按照字典顺序去排序,这一下看上去觉得很难的样.原创 2021-02-26 20:09:46 · 207 阅读 · 0 评论 -
牛客刷题——合并K个有序列表
题目:k个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。太笨了太笨了,看到有序数列合并还想不到归并排序。解法一是直接进行归并排序,使用循环进行k-1次归并,解法二是使用优先队列,由于之前没有用过这种数据结构,因此这里尝试使用优先队列进行解决。首先使用优先队列的话要重新调整compare方法,使其能够适应ListNode的值的比较。使用优先队列不需要将所有链表的节点加入,只需要将链表的头节点加入到队列中,队列会根据节点值对队列元素进行排序,然后对队列进行遍历...原创 2021-02-26 17:10:13 · 298 阅读 · 0 评论 -
牛客刷题——重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。eg: 输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]输出:{1,2,5,3,4,6,7}真不敢相信我写出来了。。。二叉树重建在之前数据结构的课上就学过,通过先序遍历和中序遍历能够确定一棵二叉树,思路其实还挺简单的,根据先序遍历可以.原创 2021-02-26 15:42:18 · 194 阅读 · 0 评论 -
牛客刷题——二叉树的之字形排列
题目:给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定的二叉树是{3,9,20,#,#,15,7},结果输出为:[[3],[20,9],[15,7]]已经对二叉树相关的题产生好感了,(可能是还没有受到二叉树的毒打,但是感觉掌握了二叉树的几种遍历后,做题会有思路一点) ,这道题是“之”字形遍历,看上去很复杂的样子,其实就是变相的层序遍历。首先正常的层序遍历的话需要用到队列来作为辅助,由于队列是先进先出,这样也保证了.原创 2021-02-25 20:09:36 · 490 阅读 · 0 评论 -
牛客刷题——二叉树的最近公共祖先
题目:给定一棵二叉树以及这棵树上的两个节点 o1和o2,请找到 o1和o2的最近公共祖先节点。 (这里的每个节点的值都是不同的)eg:输入:[3,5,1,6,2,0,8,#,#,7,4],5,1输出:3这道题,我看完根本无从下手,不知道怎么分析“最近”这个条件,公共祖先还好说,只要当前节点的左右子树或者自身包含了两个值,就是公共祖先,但是怎么去保证是最近的呢?看了几篇文章,代码也没咋看懂,感觉十分复杂,终于看到了一篇大佬的文章,清晰明白,代码也很容易懂。原文链接为:https:/...原创 2021-02-25 10:12:35 · 178 阅读 · 0 评论 -
牛客刷题——最长公共子串
题目:给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。输入:"1AB2345CD","12345EF"输出:"2345"看完题目想到了用动归,刚开始分析的时候想着,对于每两个元素的比较,有两种情况,1.元素相同,那么当前元素能够成的最长公共子串的长度为上一个的+1;2.元素不相同,那么构成的最长公共子串长度为0。但是没有考虑清楚,对于情况1 的上一个元素是什么样的,动归计算出来的是一个序列还是一个二维矩阵。。。。总之也算是有点进步了,嗯。..原创 2021-02-24 18:34:59 · 290 阅读 · 1 评论 -
牛客刷题——最长回文子序列
题目:对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。示例1输入:"abc1234321ab",12输出:7这道题之前也遇到过,这次做的时候又忘记了一个点,回文的格式有两种, "a" 和 “aa” 这两种格式,在写的时候只想到了 "a" ,用例通过了一部分,才发现漏了一种情况,对于回文的判断,以当前字符为中心,使用双指针向左右两边进行扩展比较,然后判断以当前为中心的字符所能构成的最大回文的长度,使用max来进行更新即..原创 2021-02-22 09:26:43 · 230 阅读 · 0 评论 -
牛客刷题——股票(一次交易)
题目:假设你有一个数组,其中第 i个元素是股票在第i天的价格。你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。这题一看刚开始有个理解误区,想着找出最大的index和最小的index,保证最最小的index小于最大的index即可,然后求最大利润。但是跑用例的时候却发现,这个最大和最小都是相对的,没办法从整个变化的区间中进行确定,所以还是需要用动规来做。对于动规一直比较迷,似会非会的感觉。首先确定动规方程,对于第i天来说,可以卖出获...原创 2021-02-09 15:38:56 · 464 阅读 · 0 评论 -
牛客刷题——链表中环的入口
题目:对于一个给定的链表,返回环的入口节点,如果没有环,返回null链表环的问题在经过了上一次之后,已经掌握了怎么判断是否有环......这道题在写的时候也参考了别人的博客,看完之后感觉好强,但是文字描述可能说不清楚,人家的图片和数学分析都很到位,所以这里就偷个懒,站在大佬的肩膀上写博客。方法一是使用HashSet,将遍历到的节点add到set中,如果add不成功的话,那么当前节点就是环的入口啦。方法二是基于以前的slow和fast指针来进行判断的,具体的分析可以参考以下文章htt..原创 2021-02-07 19:43:11 · 96 阅读 · 0 评论 -
牛客刷题——链表中的节点每K个一组反转
题目:将给出的链表中的节点每 k个一组翻转,返回翻转后的链表如果链表中的节点数不是 k的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。要求空间复杂度O(1)例如:给定的链表是1->2->3->4->5对于 k=2, 你应该返回2->1->4->3->5对于k=3, 你应该返回3->2->1->4->5首先解决的方法肯定是以链表反转为基础的,但是这个反转不是反转整...原创 2021-02-07 19:33:35 · 240 阅读 · 0 评论 -
牛客刷题——合并两个有序数组
题目:给出两个有序的整数数组A 和 B,请将数组 B合并到数组 A中,变成一个有序的数组注意:可以假设 A数组有足够的空间存放 B数组的元素,A和 B中初始的元素数目分别为 m和 n.这个题目的思路也比较有趣,由于A有足够的空间放B,而A和B的元素个数也是知道的,但是从前向后排的话,需要进行很多元素移动和中间保存的操作,效率很低,因此考虑从后往前排,因为在数组A中,从m-m+n这些位置是空闲的,所以考虑从后向前排序,从A的末尾元素i和B的末尾元素j开始进行比较,将较大的元素放...原创 2021-02-05 15:55:38 · 394 阅读 · 0 评论 -
牛客刷题——最长无重复子串
题目:给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。这个题目写过几遍了,终于记住了滑动区间的思想。定义两个指针,left和right分别对应区间的起止index,定义max存储遇到的最长无重复子串长度,right指针向右扫描,每扫描一个去判断当前字符是不是在区间里出现过了,如果没有出现过的话计算当前区间的长度,更新max,如果出现了,那么left指针就需要往右移动,移动到出现的重复字符的下一个位置....重复上述步骤直到right==arr.length.原创 2021-02-05 15:49:41 · 191 阅读 · 0 评论 -
牛客刷题——用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。队列是先入先出,堆栈是先入后出,通过两个堆栈的push和pop操作可以实现堆栈的元素反转,从而达到先入先出的效果。假设stack1是正常的栈,statck2是逆序的栈(和队列顺序一致),对于push操作,要保证新push的元素位于所有元素的最后,所以要先将stack2的元素pop出来push进stack1里,然后将新元素push,对于pop操作,要保证pop的元素的最先push进去的,相当于pop出栈底元..原创 2021-02-05 15:36:16 · 140 阅读 · 0 评论 -
牛客刷题——子数组最大累加和
题目:给定一个数组arr,返回子数组的最大累加和例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.题目保证没有全为负数的数据[要求]时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)在进行累加和判断的时候首先需要明确,如果到目前为止的累加和 <0,那么这段累加和肯定是要舍弃的,会影响到后面的大小。所以算法只需要使用一次遍历,通过current存储当前累加和,使用ma..原创 2021-02-05 15:17:08 · 138 阅读 · 0 评论 -
牛客刷题——两数之和
题目:给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2原题中给了“哈希”这个关键词的提示,不然我可能还是会傻傻的进行遍历....先使用哈希将数组重新存储一遍,key为值,valu...原创 2021-02-05 15:09:10 · 224 阅读 · 0 评论 -
牛客刷题——跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。天哪,跳台阶都不会写....依稀记得本科离散好像讲过这个题,理解了跳台阶的原理就很好写了,如果直接说让我写一个斐波那契数列,那我肯定还是可能写的...跳台阶的话首先知道n=1时,k=1,n=2时,k=2,n=3时则从后往前思考,如果从上一步调到3的话,可能的情况有两种,即上一步跳了一级和上一步跳了两级,跳了一级的话则上一步在n=2,有两种跳法,跳了两级则n=1,有1中跳法,.原创 2021-02-03 17:20:01 · 148 阅读 · 0 评论 -
牛客刷题——第K大的数
题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。这个的题目中提示采用快速排序的方法进行查找,在快排的时候,通过左右指针和a[end]的比较,以及right和left左右数的交换,最后能够得到第left小的数是a[end]。(这里要注意,由于是升序排序,所以得到的数是第k小,而不是第k大,当时这一块没想明白,调试了好久)。所以可以换个思路,按照降序排序的思路写快排,left..原创 2021-02-03 17:14:14 · 225 阅读 · 0 评论 -
牛客刷题——求二叉树的层次遍历
题目:给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)例如:给定的二叉树是{3,9,20,#,#,15,7},该二叉树层序遍历的结果是[[3],[9,20],[15,7]]对于不分层直接输出的层次遍历,直接采用队列的思想,首先root入队,针对队列的每一个元素,当前元素出队,访问,当前元素的左右孩子入队,直到队列为空,这里需要进行分层输出,所以在进行访问的时候也需要进行分层处理。主要思想是,每一层采用一个队列,在对当前层遍历的同时,将当前层的孩子放入到新..原创 2021-02-02 15:34:22 · 157 阅读 · 0 评论 -
牛客刷题——二分查找
题目:请实现有重复数字的升序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。本质上还是二分查找,只是在对mid值和查找值index之间的处理有些不同。采用递归实现的二分查找的话,在进行index和arr[mid]的判断的时候分成了三种情况,等于,大于和小于,等于的时候直接返回index,大于的时候去前半段进行查找,小于的时候去后半段查找,但是题目的要求是查找“第一个大于等于index”的位置,没有的话输出长度加一,并且数组中是包含重复.原创 2021-02-02 09:29:42 · 691 阅读 · 0 评论 -
牛客刷题——判断单链表中是否有环
这个题其实和链表反转类似,做过就知道,没做过就要想半天....这里采用的快慢指针的方式,如果有环的话,快指针肯定会比慢指针先进入环,这样的话就可以理解为两个不同速度的人在操场上跑步,快的人肯定会“追上”慢的人,相反没有环的话,两个人是沿着直线跑步,肯定不会遇上的。所以根据上述条件使用while循环进行遍历,如果走到了快指针等于慢指针,那么就存在环,否则不存在环。这里需要对while的判断条件进行记录一下,刚开始写成了slow!=nul&&fast.next!=null,因为考虑到原创 2021-02-01 15:49:42 · 113 阅读 · 0 评论 -
牛客刷题——设计LRU缓存结构
题目:设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1) 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x, y,表示set(x, y)若opt=2,接下来一个整.原创 2021-02-01 15:21:03 · 272 阅读 · 1 评论