牛客网刷题-二叉树的镜像
问题描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:输入一棵二叉树输出描述:输出二叉树的镜像示例示例1输入输出解决思路分析通过递归实现对左右子树的交换,可以自下而上,也可以自上而下方法通过递归 自下而上 交换代码实现public class Solution { public void Mirror(TreeNode root) { if (root == null) { return;
牛客网刷题-判断一个链表是否为回文结构
问题描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:输入一个链表输出描述:输出链表是否是回文结构示例示例1输入[1,2,2,1]输出true解决思路分析通过队列解决,将链表的所有节点添加到双端队列中,依次弹出头部元素和尾部元素做判断通过改变右半区的结构(后期会补充代码),改变右半区的结构,相当于两边向中间做比较方法通过队列解决代码实现public class Solution { public boolean isPail(Li
牛客网刷题-缺失数字
问题描述从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,找出这n个数中缺失的那个数,要求O(n)尽可能小。输入描述:输入一个数组(0-n)输出描述:输出缺失的数字示例示例1输入[0,1,2,3,4,5,7]输出6解决思路分析通过循环通过数学的思路,1-n的和为 n*(n+1)/2通过异或的特性,计算结果相同的数字异或为0,任意数字与0异或都是原值方法通过循环,判断前后差值是否大于1通过数学的思路,1-n的和为 n*(n+1)/2 ,依
牛客网刷题-输出二叉树的右视图
问题描述请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图。输入描述:输入二叉树的前序和中序遍历输出描述:输出二叉树的右视图示例示例1输入[1,2,4,5,3],[4,2,5,1,3]输出[1,3,5]解决思路分析根据二叉树的前序和中序还原二叉树,然后通过广度优先遍历得到二叉树的右视图方法根据二叉树的前序和中序遍历的特点还原二叉树(可以看考这篇文章二叉树的重建)通过队列实现二叉树的广度优先遍历,得到最右侧的节点,从而得到右视图。代码
牛客网刷题-判断链表中是否有环
问题描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。输入描述:输入一个链表输出描述:输出链表是否包含环示例示例1输入1->2->3输出false解决思路分析通过快慢指针的方式,一个指针一次过一个节点,另一个指针一次过两个节点,当快节点追上来满节点,则说明包含环状结构。方法通过快慢指针的方式判断(龟兔赛跑:图片采用了力扣的图片)代码实现// 思路1public class Solution { if
牛客网刷题-二叉树是否存在指定节点的路径
问题描述给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum 的路径。输入描述:输入一棵树输出描述:输出是否存在指定sum的路径示例示例1输入22输出 (包含的路径:5->4->11->2)true解决思路分析通过递归判断所有的路径,只要包含返回true,不同路径之间是 || 的关系。方法递归判断是否包含指定和的路径代码实现// 思路1public class Solution { publi
牛客网刷题-链表中的节点每k个一组翻转
问题描述将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。要求空间复杂度 O(1)例如:给定的链表是1→2→3→4→5对于 k=2, 你应该返回 2→1→4→3→5对于 k=3, 你应该返回 3→2→1→4→5输入描述:输入一个链表和指定的k值输出描述:翻转后的链表示例示例1输入1→2→3→4→5,2输出2→1→4→3→5解决思路分析通过计算长
牛客网刷题-判断二叉树是否对称
问题描述给定一棵二叉树,判断琪是否是自身的镜像(即:是否对称)例如:下面这棵二叉树是对称的下面这棵二叉树不对称。输入描述:输入一个链表和指定的k值输出描述:翻转后的链表示例示例1输入{1,2,2}输出true解决思路分析通过递归或者迭代的方式依次对称性的判断两边的节点。方法通过递归的方式通过迭代的方式(后期会补充)代码实现// 思路1,通过递归的方式public class Solution { public boolean i
牛客网刷题-合并有序链表
问题描述将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。输入描述:输入两个链表输出描述:输出排序好的链表示例示例1输入{1},{2}输出{1,2}解决思路分析添加一个额外节点,通过对比两个节点,然后一次向这个额外节点追加节点。方法添加一个额外节点,通过对比两个节点,然后一次向这个额外节点追加节点。代码实现// 思路1public class Solution { public Lis
牛客网刷题-链表中环的入口节点
问题描述对于一个给定的链表,返回环的入口节点,如果没有环,返回null拓展:你能给出不利用额外空间的解法么?输入描述:输入一个链表输出描述:输出环的入口节点示例示例1输入{-3,-2,-1,0,1,2,3,4,0(环形)}输出{0}解决思路分析hash表(使用额外的空间):通过遍历记录到hash表的方式找到环形链表的入口时间负责度:O(n)空间负责度:O(n)快慢指针(不使用额外空间):通过快慢指针的方式实现,下面具体介绍:论证过程:(注意,快慢
牛客网刷题-大数加法
问题描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。(字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成)输入描述:输入两个字符串格式数字输出描述:输出数字相加的和示例示例1输入“1”,“99”输出“100”解决思路分析从末位向前依次处理,处理进位的情况,需要处理相加和超出最长字符串位数的情况方法通过循环从末位向前依次处理,处理进位的情况,需要处理相加和超出最长字符串位数的情况代码实现// 思路
牛客网刷题-合并k个已排序的链表
问题描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。(字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成)输入描述:输入两个字符串格式数字输出描述:输出数字相加的和示例示例1输入“1”,“99”输出“100”解决思路分析从末位向前依次处理,处理进位的情况,需要处理相加和超出最长字符串位数的情况方法通过循环从末位向前依次处理,处理进位的情况,需要处理相加和超出最长字符串位数的情况代码实现// 思路
牛客网刷题-二叉树根节点到叶子节点和为指定值的路径
问题描述给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于 sum 的路径。输入描述:输入一棵二叉树,一个sum和输出描述:输出所有满足条件的路径示例示例1输入给出如下的二叉树,sum=22,输出[[5,4,11,2],[5,8,9]]解决思路分析采用深度优先搜索遍历的方式,通过回溯法记录走过的路径,判断每一条路径是否符合条件。深度优先遍历:从跟节点遍历,延某一条路径直到遍历到叶子节点再返回,继续遍历其他路径回溯法 :(
牛客网刷题-字符串的排列
问题描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。输入描述:输入一个字符串输出描述:输出字符串的所有排列示例示例1输入abc输出abc,acb,bac,bca,cab,cb解决思路分析采用深度优先搜索遍历的方式,采用先固定某个元素,交换其他元素的方式。方法采用深度优先搜索遍历的方式,采用先固定某个元素,交换其他元素的方式。(后期会补图)递归分析递归参数:arr 字节数组,list 结果, i 下标终止条件:终止条件:当i达到了字符
牛客网刷题-在转动过的有序数组中寻找目标值
问题描述给出一个转动过的有序数组,你事先不知道该数组转动了多少。在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。假设数组中不存在重复项。输入描述:输入一个转动的数组输出描述:输出目标值的索引示例示例1输入[3,2,1],1输出2解决思路分析采用变形的二分查找。方法虽然题目给出的是转动的数组,但是我们可以在正确的区间用二分法二分法三个变量:start,end,mid如果 arr[mid] < arr[end],说
牛客网刷题-数组中出现次数超过一半的数字
问题描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。输入描述:输入一个数组输出描述:输出出现次数超过一半的数字示例示例1输入[1,2,3,2,2,2,5,4,2]输出2解决思路分析采用hash的方法。通过第一次遍历找出出现次数最多的数字,第二次遍历统计该数字出现的次数方法通过hash的方法,借助 hashMap存储统计数字出现的次数,如果发现符合条件的数字,返回通过第一次遍历找出出现次数最多的数字,第二次遍历统计该数字出现的次数
牛客网刷题-括号序列
问题描述给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。输入描述:输入一个括号的字符串输出描述:输出这个括号是否合法示例示例1输入“[]”输出true解决思路分析借助栈数据结构,可以碰到左括号如栈,右括号出栈方法借助栈数据结构,可以碰到左括号如栈,右括号出栈。(PS小技巧:可以碰到左括
今日推荐
周排行