牛客题库--C++
lxy_lucky
游戏开发萌新
展开
-
判断链表中是否有环---CPP实现
描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。思路:可以使用快慢指针遍历链表。如果链表中存在环,则快慢指针最总会相遇,出现 “快指针==慢指针” 的情况。如果没有,可以设置控制条件:当快指针不为nullptr 或 快指针的next为空时返回,表示链表中没有环。代码:class Solution {public: bool hasCycle(ListNode *head) { ListNode* Slow{head};原创 2021-10-14 22:57:59 · 137 阅读 · 0 评论 -
计算逆波兰式(后缀表达式)的值---CPP实现
描述计算逆波兰式(后缀表达式)的值运算符仅包含"+","-","*"和"/",被操作数可能是整数或其他表达式思路:这道题直接给了后缀表达式,所以省去了我们将中序表达式转换为后缀表达式的过程。后缀表达式的求值应借用栈来实现,即按顺序扫描后缀表达式,将数字入栈,遇到运算符,则弹出栈顶的两个元素进行相应运算,然后将运算结果再次入栈,重复此操作直到扫描结束。代码:class Solution {public: int evalRPN(vector<string>&原创 2021-10-06 20:44:08 · 320 阅读 · 0 评论 -
二叉树的最小深度---cpp实现
描述求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。思路:可以采用广度优先遍历二叉树,当遍历到的第一个节点为叶子节点时,返回该叶子节点的所在深度即可。为此可以自建一个结构存储节点和层数的信息。代码如下:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//**广度优先遍历二叉树*/class Solu原创 2021-10-05 21:46:02 · 134 阅读 · 0 评论 -
输出二叉树的右视图--CPP实现
描述请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图思路:1、根据先序和后序遍历结果,反推二叉树(还原为为二叉树)2、层序遍历树,输出每一层的最右面的元素3、返回class Solution {public: vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) { // write code here原创 2021-09-29 22:12:27 · 147 阅读 · 0 评论 -
最长递增子序列---CPP实现
描述给定数组 arr ,设长度为 n ,输出 arr 的最长递增子序列。(如果有多个答案,请输出其中 按数值(注:区别于按单个字符的ASCII码值)进行比较的 字典序最小的那个)思路:分为两步:找到最长递增子序列、如长度相等,返回按位置顺序字典值小的那一组。(复杂度较高,有待优化 ~( = = ) /class Solution {public: /** * retrun the longest increasing subsequence * @par...原创 2021-09-28 22:02:59 · 131 阅读 · 0 评论 -
在二叉树中找到两个节点的最近公共祖先---CPP实现
描述给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1和o2,请找到 o1和o2的最近公共祖先节点。思路:递归。找到两个节点的公共祖先,首先需要找到节点,所以肯定要用到查找。所以使用dfs查找。那么如何确定最近公共祖先呢?我们可以将深度优先找到节点的路径使用容器保存起来,然后比较两个容器最后相等的元素所对应的节点,即为两节点的最近公共祖先。所以,简单来说,思路就是递归寻找目标节点,并将路径保存下来,最后比较两容器元素,返回最后一个相同的节点即可。代码:/**...原创 2021-09-27 23:19:07 · 312 阅读 · 0 评论 -
两个链表生成相加链表---CPP实现
描述假设链表中每一个节点的值都在 0 - 9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。思路:可以使用栈的“先进后出”特性,先将两个链表分别做入栈操作,然后每次两个栈各出栈一个元素进行相加求余操作,因为相加所以肯定要考虑进位操作,所以设置一位为进位标识符,如果相加两元素>=10,则置为1,在每次相加时加上进位数然后将进位数置为0,再判断元素和是否>=10,对进位位进行操作,然后求余之后的数就可以构造为一个节点使用头插法转换为链表了.原创 2021-09-26 20:42:46 · 164 阅读 · 0 评论 -
最长无重复子数组---CPP实现
描述给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组思路:题目很明确,子数组是连续的,且寻找的子数组不能有重复值,所以我选用了map容器,采用双指针的办法遍历数组,每次遍历将当前数组元素用作键和值插入map,并使用一个pair类型的变量接收返回值,用pair的值部分判断是否插入成功,如果插入失败,就说明有了重复元素,此时就将当前子串长度和最原创 2021-09-25 21:03:00 · 264 阅读 · 0 评论 -
子数组的最大累加和问题---CPP解法
描述给定一个长度为 n 的数组 arr ,返回其中任意子数组的最大累加和。(没有全部是负数的情况)解答思路:首先要明确:什么是数组的子数组?我一开始以为是所有元素的排列组合(即可以不连续),所以使用了贪心算法,收集了所有正数元素,返回然后累加和,结果当然是不正确的。。。数组的子数组是连续的,即下标连续的一串数据,最大长度等于母数组。解法:这道题可以分析出:从首项开始遍历数组求累加和,每一次都将sum和0、ret和sum比较,取较大值。如果累加和sum小于0,那么说明此项之前的子数原创 2021-09-24 22:23:02 · 254 阅读 · 0 评论