牛客
牛客
会做饭的好同学
遇多少风浪,心不再摇晃
展开
-
牛客BM44. 有效括号序列
Description:题目大意:括号匹配。解题思路:算法标签:栈代码:class Solution {public: bool isValid(string s) { stack<char>data; int len = s.length(); if(len % 2 == 1) return false; if(s[0] == '}' || s[0] == ']' || s[0] ==原创 2022-04-25 10:38:19 · 128 阅读 · 0 评论 -
牛客BM43. 包含min函数的栈
Description:题目大意:实现可以输出最小值的栈。解题思路:算法标签:栈创建两个栈,一个存储数值,一个存储最小值出栈的时候,minn 改为 top即可代码:class Solution {public: int minn; stack<int>number; stack<int>minnumber; void push(int value) { if(number.empty()) m原创 2022-04-25 10:28:31 · 125 阅读 · 0 评论 -
牛客BM42. 用两个栈实现队列
Description:题目大意:用两个栈实现队列。解题思路:算法标签:栈代码:class Solution{public: void push(int node) { stack1.push(node); return; } int pop() { while(!stack2.empty()) stack2.pop(); while(!stack1.empty()) {原创 2022-04-24 11:00:33 · 335 阅读 · 0 评论 -
牛客BM41. 输出二叉树的右视图
Description:题目大意:给出二叉树的前序遍历和中序遍历,输出右视图。解题思路:算法标签:BFS通过前序遍历和中序遍历构造二叉树。利用层序遍历找到右视图。代码:class Solution {public: vector<int> rightSideView(TreeNode* root) { unordered_map<int ,int>rightview; int maxdepth = -1;原创 2022-04-22 10:17:49 · 1074 阅读 · 0 评论 -
牛客BM40. 重建二叉树
Description:题目大意:利用前序遍历和中序遍历构造二叉树。解题思路:算法标签:二叉树,递归构建中序遍历元素和下标的映射利用前序遍历的特性,第一个点便是根节点然后根据根节点在中序遍历中找到对应的下标下标左边的构造左子树,下标右边的构造右子树代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;原创 2022-04-21 09:15:48 · 279 阅读 · 0 评论 -
牛客BM39. 序列化二叉树
Description:题目大意:将二叉树序列号然后反序列化解题思路:算法标签:BFS,层序遍历代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: //原创 2022-04-20 16:02:30 · 305 阅读 · 0 评论 -
牛客BM38. 在二叉树中找到两个节点的最近公共祖先
Description:题目大意:在一个二叉树上给出两个点,找到他们的最近公共祖先。解题思路:算法标签:DFSDFS,求根节点到两个节点的路径 load1和 load2。因为最近公共祖先的到根节点都相同,找到两个最后相同的点即为最近公共祖先。代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {publi原创 2022-04-08 15:34:33 · 756 阅读 · 0 评论 -
牛客BM37. 二叉搜索树的最近公共祖先
Description:题目大意:给出两个节点,在二叉搜索树上找到其最近公共祖先。解题思路:算法标签:递归利用二叉搜索树的性质进行查找。代码:/* * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */class Solution {p原创 2022-04-07 10:01:34 · 404 阅读 · 0 评论 -
牛客BM36. 判断是不是平衡二叉树
Description:题目大意:判断是不是平衡二叉树,左右子树高度绝对值不超过 1解题思路:算法标签:递归代码:class Solution {public: bool isbalance = true; int depth(TreeNode* root) { if(root == NULL) return 0; // 求左右子树的深度 int leftdepth = depth(root原创 2022-04-07 09:50:50 · 276 阅读 · 0 评论 -
牛客BM35. 判断是不是完全二叉树
Description:题目大意:判断是不是完全二叉树解题思路:算法标签:BFS完全二叉树的空节点在最后结尾处进行层序遍历,如果未到结尾处就访问到空节点,则不是完全二叉树代码:/* * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; *原创 2022-04-07 09:36:03 · 770 阅读 · 0 评论 -
牛客BM34. 判断是不是二叉搜索树
Description:题目大意:给出一个二叉树,判断是不是二叉搜索树解题思路:算法标签:DFS二叉树搜索树的根节点大于左子树节点,小于右子树节点初始化 root 的左端节点为 INT_MIN,右端节点为 INT_MAX递归左右子树代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nul原创 2022-04-07 09:32:42 · 157 阅读 · 0 评论 -
牛客BM33. 二叉树的镜像
Description:题目大意:给定一个二叉树,将其变换为源二叉树的镜像。解题思路:算法标签:递归代码:/* * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */class Solution {public: TreeNode原创 2022-04-07 09:27:33 · 742 阅读 · 0 评论 -
牛客BM32. 合并二叉树
Description:题目大意:合并两棵二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。解题思路:算法标签:递归代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: TreeNode* mergeTrees(TreeNode* t1, TreeN原创 2022-04-07 09:24:53 · 267 阅读 · 0 评论 -
牛客BM31. 对称的二叉树
Description:题目大意:判断是不是一个对称二叉树解题思路:算法标签:递归如果左右都为 NULL ,返回 true如果只有一个为 NULL ,返回 false代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2022-04-06 11:09:08 · 501 阅读 · 0 评论 -
牛客BM30. 二叉搜索树与双向链表
Description:题目大意:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。解题思路:算法标签:二叉树中序遍历二叉搜索树的中序遍历就是有序的遍历先找到二叉搜索树的最左端节点,即为链表的头节点设置 preNode 作为当前 tree 的前驱节点,preNode 的后继节点即为 当前 tree代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode原创 2022-04-06 11:01:41 · 215 阅读 · 0 评论 -
牛客BM29. 二叉树中和为某一值的路径(一)
Description:题目大意:给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。解题思路:算法标签:DFS代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: bool DFS(TreeNode* root,int tot,int原创 2022-04-06 09:37:28 · 119 阅读 · 0 评论 -
牛客BM28. 二叉树的最大深度
Description:题目大意:求二叉树的最大深度解题思路:算法标签:DFS代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: int ans; void DFS(TreeNode* root,int index) { if(root == NULL)原创 2022-04-06 09:31:06 · 173 阅读 · 0 评论 -
牛客BM27. 按之字形顺序打印二叉树
Description:题目大意:二叉树奇数行从左到右打印,偶数行从右到左打印解题思路:算法标签:二叉树层序遍历,BFS,栈按照二叉树层序遍历的思想如果是奇数行按照层序遍历顺序如果是偶数行,设置一个栈,然后存入临时数组中去代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), l原创 2022-04-06 09:28:58 · 234 阅读 · 0 评论 -
牛客BM26. 求二叉树的层序遍历
Description:题目大意:输出二叉树的层序遍历解题思路:算法标签:BFS代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: vector<vector<int> > levelOrder(TreeNode* root) { vector&l原创 2022-04-06 09:25:51 · 239 阅读 · 0 评论 -
牛客BM25. 二叉树的后序遍历
Description:题目大意:二叉树后序遍历解题思路:算法标签:二叉树,后序遍历代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */class Solution {public: vector<int&g原创 2022-04-06 09:24:00 · 134 阅读 · 0 评论 -
牛客BM24. 二叉树的中序遍历
Description:题目大意:二叉树中序遍历解题思路:算法标签:二叉树,中序遍历代码:/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */class Solution {public: vector<int&g原创 2022-04-06 09:22:13 · 154 阅读 · 0 评论 -
牛客BM23. 二叉树的前序遍历
Description:题目大意:二叉树前序遍历解题思路:算法标签:二叉树代码:/* * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */class Solution {public: vector<int> ans原创 2022-04-06 09:20:16 · 491 阅读 · 0 评论 -
牛客BM22. 比较版本号
Description:题目大意:给定两个字符串,比较字符串大小解题思路:算法标签:字符串字符串转化为数字,进行比较,长度短的字符串,后面补 0 代码:class Solution {public: int compare(string version1, string version2) { int ans = 0; vector<int>number1,number2; for(int i = 0;i &原创 2022-04-06 09:18:10 · 306 阅读 · 0 评论 -
牛客BM21. 旋转数组的最小数字
Description:题目大意:旋转数组中求最小值解题思路:算法标签:二分求有序序列中最小值利用二分法分别设置 left 和 right 指向最左端和最右端,mid 为 left 和 right 的中间值如果 mid 的值大于 right,说明旋转点在[mid + 1,right] 区间上如果 mid 的值小于 left,说明旋转点在[left , mid] 区间上如果 mid 的值等于right,无法判断,right左移,缩小区间代码:class Solution {publi原创 2022-04-05 15:44:41 · 212 阅读 · 0 评论 -
牛客BM20. 数组中的逆序对
Description:题目大意:寻找数组中的逆序对解题思路:算法标签:归并排序利用归并排序的原来[3,4] 和 [1,2] 合并的时候,显然 3 大于 1,以及 3 后面的数字也均大于 1,即有 mid - l + 1 个数字代码:class Solution {public: int count = 0; void merge(vector<int> &data,int left , int mid , int right) { /原创 2022-04-05 15:01:37 · 435 阅读 · 0 评论 -
牛客BM19. 寻找峰值
Description:题目大意:寻找峰值,其左右两边均小于其值解题思路:算法标签:二分法如果是上坡,则肯定有峰值,因为 nums[0]=nums[n]=−∞nums[0] = nums[n] = -\inftynums[0]=nums[n]=−∞如果是下坡,则不一定有山峰,因为可能是一直下坡代码:class Solution {public: int findPeakElement(vector<int>& nums) { int left原创 2022-04-05 10:43:18 · 142 阅读 · 0 评论 -
牛客BM18. 二维数组中的查找
Description:题目大意:查找二维数组的目标值,二维数组中从左到右依次递增,从上到下依次递增解题思路:方法一算法标签:二分查找逐行二分查找,时间复杂度 O(nlogn)O(nlogn)O(nlogn)代码:class Solution {public: bool search(vector<int>array,int target) { int left = 0,right = array.size() - 1; while(left原创 2022-04-05 10:10:55 · 206 阅读 · 0 评论 -
牛客BM17. 二分查找-I
Description:题目大意:二分查找数组,找到返回其下标,找不到返回 -1解题思路:算法标签:二分查找代码:class Solution {public: int search(vector<int>& nums, int target) { // 如果数组为空,返回 -1 if(nums.size() == 0) return -1; // 二分查找 int left =原创 2022-04-05 09:29:03 · 315 阅读 · 0 评论 -
牛客BM16. 删除有序链表中重复的元素-II
Description:题目大意:删除单链表中所有重复的元素,只保留原来链表出现一次的元素解题思路:算法标签:递归,双指针代码:/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: ListNode* deleteDuplicates(ListNode* head) { // 如果链表为空或者只有一个元素 if(he原创 2022-04-05 09:14:00 · 207 阅读 · 0 评论 -
牛客BM15. 删除有序链表中重复的元素-I
Description:题目大意:删除链表中的重复元素,使其中每个元素只能出现一次解题思路:算法标签:链表,双指针设置双指针 pre 和 last,pre 指向 head 节点,last 指向 head 的下一个节点如果 last 指向的值和 pre 的值相同,last 右移,直到找到不同的,pre 的下一个节点指向 last如果不相同,pre 和 last 同时右移代码:/** * struct ListNode { * int val; * struct ListNode *n原创 2022-04-05 09:10:48 · 480 阅读 · 0 评论 -
牛客BM14. 链表的奇偶重排
Description:题目大意:给定一个链表,奇数位置的节点排在前面,偶数位置的节点排在后面解题思路:算法标签:链表代码:/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */class Solution {public: ListNode* oddEvenList(ListNode* head) {原创 2022-04-05 09:05:49 · 328 阅读 · 0 评论 -
牛客BM13. 判断一个链表是否为回文结构
Description:题目大意:判断一个链表是不是回文结构解题思路:算法标签:链表,快慢指针,反转链表利用快慢指针寻找中点反转中点以后的链表依次对比代码:/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: ListNode* reverselist(ListNode* head) { ListNode* pre = N原创 2022-04-05 09:03:25 · 345 阅读 · 0 评论 -
牛客BM12. 单链表的排序
Description:题目大意:排序单链表元素解题思路:方法一:(更优)算法标签:sort 排序存储链表元素直接排序赋值原来的链表代码:/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: ListNode* sortInList(ListNode* head) { vector<int>number;原创 2022-04-05 08:59:55 · 134 阅读 · 0 评论 -
牛客BM11. 链表相加(二)
Description:题目大意:相加两个链表的值,左边是高位右边是低位解题思路:算法标签:栈设置两个栈,以及进位依次相加构建链表即可代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {原创 2022-04-04 15:21:27 · 408 阅读 · 0 评论 -
牛客BM10. 两个链表的第一个公共结点
Description:题目大意:找到两个链表的第一个公共节点解题思路:算法标签:双指针合并两个链表,使其公共点前面的元素个数相同设置双指针 list1 和 list2直到 list1 == list2 即为公共点代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public:原创 2022-04-04 14:49:31 · 237 阅读 · 0 评论 -
牛客BM9. 删除链表的倒数第n个节点
Description:题目大意:删除单项链表的倒数第n个节点解题思路:算法标签:双指针设置虚拟头节点设置双指针 pre 和 last,使其两个指针相隔 n 个元素双指针同时右移,直到 last 为 NULL删除 pre 的下一个元素返回 head代码:/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: ListNode* remo原创 2022-04-04 14:34:47 · 220 阅读 · 0 评论 -
牛客BM8. 链表中倒数最后k个结点
Description:题目大意:输出链表倒数 k 个节点解题思路:算法标签:双指针如果链表为空,直接返回 NULL如果链表元素个数小于 k,返回 NULL如果链表元素等于 k,直接返回 head设计虚拟头节点,设置双指针 pre 和 last,使其两个相隔 k 个元素双指针同时右移,直到 last 为 NULL,此时 pre 的下一个元素即为倒数第 k 个元素的开始代码:/* * struct ListNode { * int val; * struct ListNode *原创 2022-04-04 14:26:30 · 217 阅读 · 0 评论 -
牛客BM7. 链表中环的入口结点
Description:题目大意:寻找链表中环的入口解题思路:算法标签:set、哈希表如果只有一个元素或者空链表返回 NULL利用 set, 找到第一个集合已存在的元素,即为环的入口代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public:原创 2022-04-04 11:05:38 · 183 阅读 · 0 评论 -
牛客BM6. 判断链表中是否有环
Description:题目大意:判断链表是否有环解题思路:哈希表算法标签:set、哈希表如果链表为空或者只有一个元素,返回 false利用 set 存储每个元素判断是否有环代码:/* * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */原创 2022-04-04 10:55:35 · 135 阅读 · 0 评论 -
牛客BM5. 合并k个已排序的链表
Description:题目大意:合并 K 个已经排序的链表解题思路:算法标签:分治将 k 个链表分成两两一组然后两个链表合并最终递归合并成为一个链表代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Sol原创 2022-04-04 10:28:08 · 138 阅读 · 0 评论