牛客算法
朱景峰
这个作者很懒,什么都没留下…
展开
-
NC17 最长回文子串
题目描述:对于一个字符串(仅包含小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。 示例: 输入:"abcab", 5 返回值:1 输入:"abbba", 5返回值:5 解题思路:采用暴力求解,截取所有可能存在的字符串,判断其是否符合互文 int getLongestPalindrome(string A, int n) { // write code here in...原创 2021-09-28 20:41:19 · 129 阅读 · 0 评论 -
NC16 判断二叉树是否对称
题目描述:给定一棵二叉树,判断其是否是自身的镜像(即:是否对称) 题目示例:例如:下面这棵二叉树是对称的 1 / \ 2 2 / \ / \ 3 4 4 3 下面这棵二叉树不对称。 1 / \ 2 2 \ \ 3 3 解题思路:因为我们比较的是两个子树是否对称,所以可以用递归的方法。 bool isSymmetric(TreeNode* root) { // write code here bool ans = true...原创 2021-09-25 14:23:44 · 58 阅读 · 0 评论 -
NC15 求二叉树的层序遍历
题目描述:给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 题目示例: 该二叉树层序遍历的结果是 [ [3], [9,20], [15,7] ] 解题思路:层序遍历可以利用队列实现。首先将根节点加入队列,依次弹出队首,并将队首节点的左右子节点依次加队尾。依次循环,直至队列为空,即完成对二叉树的层序遍历。注意要设置一变量来判断遍历的层数。C++代码实现如下: vector<vector<int> > levelOrder(TreeNode.原创 2021-09-25 11:30:29 · 72 阅读 · 0 评论 -
NC14 按之字形顺序打印二叉树
题目描述:给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 示例: 该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ] 解题思路:我们可以先了解一下二叉树的层序遍历,可以采用数据结构的堆来实现,可利用容器queue。首先将根结点加入队首,之后依次执行将队首的左右子节点加入队尾,并将队首pop弹出,直到队列为空。 之字形的层序遍历与上述方法相似,此处的想法是可以借助两个栈结构来实现。两个栈分...原创 2021-09-24 08:57:45 · 54 阅读 · 0 评论 -
NC13 二叉树的最大深度
题目描述:求给定二叉树的最大深度,深度是指树的根节点到任一叶子节点路径上节点的数量。最大深度是所有叶子节点的深度的最大值。 解题思路:利用递归,遍历全二叉树,可得到每个结点的深度,记录最大结点深度即可。(本代码使用先序遍历)。 void pre(TreeNode *root,int &deep,int &maxDeep) { if(root==nullptr) return; deep++; dee原创 2021-09-23 19:13:27 · 96 阅读 · 0 评论 -
NC12 重建二叉树
题目描述:给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。 示例:例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。 解题思路:在解决这题之前,我们需要知道如何从前序遍历序列和中序遍历序列中重见二叉树。 简要步骤如下: 1.前序遍历的首个元素{1,2,4,7,3,5,6,8}作为二叉树的根节点。 2.在中序序列中找到第一次这个元素出现的地方{4,7,2,1,5,3,8,6}。 3.将中序遍历序列分割原创 2021-09-18 11:24:08 · 67 阅读 · 0 评论 -
NC11 将升序数组转化为平衡二叉搜索树
题目描述:给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST) 题目示例: 输入:[-1,0,1,2] 输出:[1,0,2,-1] 解题思路:二叉搜索树的特点就是左子树都小于根节点,右子树都大于根节点。因此我们可以采用二分法寻得数组中点作为根节点,左半边构建左子树,右半边构建右子树。同时依据示例可以判断数组为偶数个时,要选取右半边的第一个为根节点。 代码实现如下: TreeNode* sortedArrayToBST(vector<int>& n...原创 2021-09-18 10:37:57 · 91 阅读 · 0 评论 -
NC10 大数乘法
题目表述:以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。 (字符串长度不大于10000,保证字符串仅由'0'~'9'这10种字符组成) 解题思路:首先需要生成一个可以容纳最终答案长度的字符串(两数相乘,位数一定不对大于两个乘数的位数和)。下面利用循环来模拟一个数字依次从低位乘向另一个数字,每一个步骤都可以用之前生成的字符串来标记。一次循环结束就可以得出答案。具体实现可以参考代码(附逐步讲解)。 string solve(string s, string t)原创 2021-09-16 20:57:16 · 90 阅读 · 0 评论 -
NC9 二叉树中是否存在节点和为指定值的路径
题目表述:给定一个二叉树和一个值\ sumsum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径。 示例:给出如下的二叉树,sum=22, 返回true,因为存在一条路径5→4→11→2的节点值之和为 22 解题思路:此题和NC8解题思路相同,一个需要返回所有路径,一个只需要判断路径是否存在。设置一个状态变量,利用先序遍历实现。当每遍历到一个节点时,计算根节点到当前结点的路径和。当遍历到根节点时,判断路径的和是否等于要求数值,相等则直接状态量标位true后返回;当遍历结...原创 2021-09-16 16:25:25 · 115 阅读 · 0 评论 -
NC8 二叉树根节点到叶子节点和为指定值的路径
题目描述:给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum的路径。 示例: 例如上图,sum=22,则要求的返回值为:[ [5,4,11,2], [5,8,9] ] 解题思路:利用先序遍历实现。当每遍历到一个节点时,将当前的结点数值加入到路径中。当遍历到根节点时,判断路径的和是否等于要求数值,相等则返回路径。 vector<vector<int>> pathSum(TreeNode* root, int sum) { ...原创 2021-09-15 16:45:38 · 58 阅读 · 0 评论 -
NC7 买卖股票的最好时机
题目表述:假设你有一个数组,其中第i个元素是股票在第i天的价格。 你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。 解题思路:利益最大化就是在最低点买进,在最高点卖出。要注意卖出需要在买入之后。在遍历过程中记录下当前位置遇到的最低点的价格。同时记录每天的价格前去之前的最低价,如果收益增加则保留。 int maxProfit(vector<int>& prices) { // write code her..原创 2021-09-15 16:02:03 · 63 阅读 · 0 评论 -
NC6 二叉树的最大路径和
题目表述:给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。这个路径的开始节点和结束节点可以是二叉树中的任意节点。 解题思路:首先分析每一个节点可能存在地情况。一共分为四种。 第一种是左右两个结点都是负数,返回结点本身。 第二种情况是保留节点本身和左节点。 第三种情况是保留节点本身和右节点。 第四种情况是同时保留节点本身和左右结点。 设置一个最小整数进行判断,同时递归保留所有可能的最大路径。 int maxPathSum(TreeNode* root) {原创 2021-09-15 15:37:23 · 65 阅读 · 0 评论 -
NC4 判断链表中是否有环
题目描述:判断给定的链表中是否有环。如果有环则返回true,否则返回false。 解题思路:利用快慢指针解决,如果链表存在闭环,两个指针一定会相遇。 bool hasCycle(ListNode *head) { if(head == NULL) return false; ListNode *fast = head; ListNode *slow = head; while(fast!=NULL&&fast->ne原创 2021-09-14 18:52:59 · 43 阅读 · 0 评论 -
NC5 二叉树根节点到叶子节点的所有路径和
题目描述:给定一个仅包含数字0−9的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用123来代替。 找出根节点到叶子节点的所有路径表示的数字之和 示例: 这颗二叉树一共有两条路径,根节点到叶子节点的路径 1→2用数字12代替,根节点到叶子节点的路径1→3用数字13代替,所以答案为12+13=25。 解题思路:利用先序遍历二叉树,记录下每一层的路径值,每遍历一个节点,都要重新计算当前结点的值,在叶子节点时则将值保...原创 2021-09-14 19:28:26 · 105 阅读 · 0 评论 -
NC3 链表中环的入口结点
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 解题思路: 利用快慢指针同时从A点出发,相遇时慢指针走过的距离是X+Y,快指针则是2(X+Y),为A到B到C到B到C,可以算出像一点到起点的位置是X,此时将快指针重新指向结点头部,与第一次相遇的结点相同速度出发,相遇结点为入口结口。 ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode *fast = pHead...原创 2021-09-14 16:21:32 · 67 阅读 · 0 评论 -
NC2 重排链表
题目表述:将给定的单链表L:L_0→L_1→…→L_{n-1}→L_ nL0→L1→…→Ln−1→Ln 重新排序为:L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→…L0→Ln→L1→Ln−1→L2→Ln−2→… 要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。 示例: 输入:{1,2,3,4} 返回值:{1,4,2,3} 给定head链表1->2->3->4, 重新排列为 1->4->2->3,会...原创 2021-09-14 15:58:47 · 93 阅读 · 0 评论 -
NC1 大数加法
题目表述:以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。 (字符串长度不大于100000,保证字符串仅由'0'~'9'这10种字符组成) 示例: string solve(string s, string t) { // write code here int length = s.length()>t.length()?s.length()+1:t.length()+1; string temp_zaros(.原创 2021-09-14 15:47:42 · 50 阅读 · 0 评论