
牛客网算法题
ifreewolf99
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
平衡二叉树
一.前沿 二叉排序树(又叫二叉搜索树):左子树上的所有节点的值均小于根节点值,而右子树上所有节点的值均大于根节点的值。 平衡二叉树也是一种二叉排序树,同时保证左右子树的高度差小于大于1,避免了二叉搜索树”链表化“。 二.平衡二叉树 先按照生成二叉搜索树的方法构造二叉树,直至二叉树变得不平衡,即出现这样的节点:左子树与右子树的高度差大于1。至于如何调整,要看插入的导致二叉树不平衡的节点的位置。主要有四种调整方式:LL(左旋)、RR(右旋)、LR(先左旋再右旋)、RL(先右旋再左旋)。 1.左旋原创 2020-09-29 15:46:05 · 415 阅读 · 0 评论 -
二维矩阵最短路径 :广度优先搜索
题目: 要去一个任务点(任务点用字符”T“ 表示)完成任务, 地图上多个传送点(传送点用字符"X" 表示)。可以选择任意一个传送点作为起点, 请问哪些传送点到任务点的距离最短。 在地图上只能上下左右移动,不能斜着移动。 输入描述: 第一行包含2个整数N和M, 接下来N行每行包含M个字符, 字符”T“表示任务点(只有一个), 字符”X“表示传送点,字符”0“表示可以通行的路, 字符”1“表示不可以通行的障碍物。 输出描述: 输出两行,第一行包含一个整数,表示传送点到任务点的最短距离,第二行包含到原创 2020-09-26 22:50:16 · 1083 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法一:HashMap class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { unordered_map<int, int> mp; for(const int k : data) ++mp[k];原创 2020-09-26 19:00:19 · 159 阅读 · 2 评论 -
二进制中1的个数
题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 方法一:二进制移位法 class Solution { public: int NumberOf1(int n) { int ans = 0; int mark = 0x01; while(mark != 0){ if(mark & n) ++ans; mark <<= 1;原创 2020-09-26 17:12:31 · 125 阅读 · 0 评论 -
2020-09-09
class Solution { public: int rob(vector<int>& nums) { if (nums.empty()) { return 0; } int size = nums.size(); if (size == 1) { return nums[0]; } vector<int> dp = v.原创 2020-09-10 20:53:22 · 99 阅读 · 0 评论 -
反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。 初始化:3个指针 1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向nullptr 2)cur指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向head 3)nex指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存 接下来,循环执行以下三个操作 1)nex = cur->next, 保存作用 2)cur->next = pre 未反转链表的第一个节原创 2020-09-06 17:27:21 · 246 阅读 · 0 评论 -
位移法实现加法运算
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 题解 题目描述:不使用加减乘除来实现两数加法、 方法:位运算 知识补充: 按位与&,按位或|, 按位异或^ 2.补码 计算机中存整数n是用补码存的。 如果n为正数,则原码=反码=补码 如果n为负数,则补码=反码+1 本题是考察对位运算的运用,使用位运算来实现两数的加法。 设两数字的二进制形式 a,b ,其求和 s = a + b ,a(i) 代表 a 的二进制第 i 位,则分为以下原创 2020-09-06 16:26:24 · 900 阅读 · 0 评论 -
把字符串转换成int整数
题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 题解 题目意思很明确,这道题难就难在边界的考察。如果对于一般规则的数字“字符串”转化为数字都很容易,比如: int的范围为[2^{31}-1, -2^{31}][231−1,−231] 如果超过了这两个范围该怎么办? 其实也很简单,首先判断这个数的正.原创 2020-09-06 13:18:00 · 4653 阅读 · 0 评论 -
构建乘积数组:动态规划的应用
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];) 对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。 题解 题目描述:给定一个长度为n的数组A,求数组B,B[i] = A原创 2020-09-05 08:54:13 · 169 阅读 · 0 评论 -
C++正则表达式的应用
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 #include <regex> class Solution { public: bool isNumeric(char* s) { if(!s || *s=='\0'){ r原创 2020-09-04 23:21:15 · 141 阅读 · 0 评论 -
字符流中第一个不重复的字符:队列和unorder_map的应用
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 方法:哈希+队列 针对题目的描述,我们先提出两个问题? Q1. 给定一个字符串(只不过这里的字符串是可变的),如果快速判断一个字符是否存在于字符串中,如果存在,也就是重复? Q2. 这里先不考虑重复,如果快速返回第一个字符?有没有感觉有点像先来先服务? 对于一道题,如果没有思路原创 2020-09-04 23:12:56 · 219 阅读 · 0 评论 -
输出数组的全排列
void perm(int list[], int k, int m) { if ( ) { copy(list,list+m,ostream_iterator<int>(cout," ")); cout<<endl; return; } for (int i=k; i<=m; i++) { swap(&list[k],&list[i]); .原创 2020-09-02 11:19:03 · 697 阅读 · 0 评论 -
链表中环的入口结点
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 方法一:哈希法 1.遍历单链表的每个结点 2.如果当前结点地址没有出现在set中,则存入set中 3.否则,出现在set中,则当前结点就是环的入口结点 4.整个单链表遍历完,若没出现在set中,则不存在环 代码 class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { unordered_set&原创 2020-08-30 19:18:24 · 311 阅读 · 0 评论 -
删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路: 我的思路是先定义一个哑节点dump,哑节点的next指向pHead的第一个元素。定义一个pre指针指向哑节点dump,定义一个cur指针指向pHead的第一个节点。 1.判断pre->next->val==pre->next->val,原创 2020-08-30 16:43:03 · 122 阅读 · 0 评论 -
二叉树的下一个节点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 红色数字是中序遍历的顺序。接下来,我们就假设,如果当前结点分别是1,2 ... 7,下一结点看有什么规律没? 1 => 2 // 显然下一结点是 1 的父亲结点 2 => 3 // 下一节点是当前结点右孩子的左孩子结点,其实你也应该想到了,应该是一直到左孩子为空的那个结点 3 => 4 // 跟 2 的情况相似,当前结点右孩子结点的左原创 2020-08-30 11:37:34 · 255 阅读 · 0 评论 -
对称的二叉树:递归的使用
题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 题解 题目描述:给定一颗二叉树,判断此二叉树是否为对称二叉树。 根据上图可知:若满足对称二叉树,必须满足: 1. L->val == R->val 2. L->left->val == R->right->val 3. L->right->val == R->left->val 设置一个递归函数isSame(r原创 2020-08-30 09:49:06 · 233 阅读 · 0 评论 -
把二叉树打印成多行:广度优先的使用
题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 方法:队列 层次遍历打印二叉树,用队列实现。 BFS的模板为: 1.如果不需要确定当前遍历到了哪一层,模板如下: void bfs() { vis[] = {0}; // or set queue<int> pq(start_val); while (!pq.empty()) { int cur = pq.front(); pq.pop(); for (遍历cur所有的相邻节点n原创 2020-08-29 21:47:17 · 118 阅读 · 0 评论 -
剑指offer:序列化和反序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。 二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。 例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通原创 2020-08-26 23:23:28 · 114 阅读 · 0 评论 -
牛客网:二叉搜索树的第k个结点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 方法一:递归方法 这个方法的思路是先将指针移到最左端,然后再回溯,这个时候需要添加对右字符的遍历。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x..原创 2020-08-26 22:45:01 · 163 阅读 · 0 评论 -
剑指offer:数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 方法一:查找排序法 思路:得到输入数组arr,可以获得len的长度,因此需要获得arr的前len/2数据量获得排序。 class Solution { public: vector<int>原创 2020-08-25 22:42:28 · 178 阅读 · 0 评论