牛客网算法题
ifreewolf99
这个作者很懒,什么都没留下…
展开
-
平衡二叉树
一.前沿二叉排序树(又叫二叉搜索树):左子树上的所有节点的值均小于根节点值,而右子树上所有节点的值均大于根节点的值。平衡二叉树也是一种二叉排序树,同时保证左右子树的高度差小于大于1,避免了二叉搜索树”链表化“。二.平衡二叉树先按照生成二叉搜索树的方法构造二叉树,直至二叉树变得不平衡,即出现这样的节点:左子树与右子树的高度差大于1。至于如何调整,要看插入的导致二叉树不平衡的节点的位置。主要有四种调整方式:LL(左旋)、RR(右旋)、LR(先左旋再右旋)、RL(先右旋再左旋)。1.左旋原创 2020-09-29 15:46:05 · 340 阅读 · 0 评论 -
二维矩阵最短路径 :广度优先搜索
题目:要去一个任务点(任务点用字符”T“ 表示)完成任务, 地图上多个传送点(传送点用字符"X" 表示)。可以选择任意一个传送点作为起点, 请问哪些传送点到任务点的距离最短。在地图上只能上下左右移动,不能斜着移动。输入描述:第一行包含2个整数N和M, 接下来N行每行包含M个字符, 字符”T“表示任务点(只有一个), 字符”X“表示传送点,字符”0“表示可以通行的路, 字符”1“表示不可以通行的障碍物。输出描述:输出两行,第一行包含一个整数,表示传送点到任务点的最短距离,第二行包含到原创 2020-09-26 22:50:16 · 895 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。方法一:HashMapclass 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 · 103 阅读 · 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 · 75 阅读 · 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 · 63 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。初始化:3个指针1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向nullptr2)cur指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向head3)nex指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存接下来,循环执行以下三个操作1)nex = cur->next, 保存作用2)cur->next = pre 未反转链表的第一个节原创 2020-09-06 17:27:21 · 172 阅读 · 0 评论 -
位移法实现加法运算
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。题解题目描述:不使用加减乘除来实现两数加法、方法:位运算知识补充: 按位与&,按位或|, 按位异或^ 2.补码计算机中存整数n是用补码存的。如果n为正数,则原码=反码=补码 如果n为负数,则补码=反码+1本题是考察对位运算的运用,使用位运算来实现两数的加法。设两数字的二进制形式 a,b ,其求和 s = a + b ,a(i) 代表 a 的二进制第 i 位,则分为以下原创 2020-09-06 16:26:24 · 770 阅读 · 0 评论 -
把字符串转换成int整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0题解题目意思很明确,这道题难就难在边界的考察。如果对于一般规则的数字“字符串”转化为数字都很容易,比如:int的范围为[2^{31}-1, -2^{31}][231−1,−231]如果超过了这两个范围该怎么办?其实也很简单,首先判断这个数的正.原创 2020-09-06 13:18:00 · 4490 阅读 · 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 · 123 阅读 · 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 · 109 阅读 · 0 评论 -
字符流中第一个不重复的字符:队列和unorder_map的应用
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。方法:哈希+队列针对题目的描述,我们先提出两个问题?Q1. 给定一个字符串(只不过这里的字符串是可变的),如果快速判断一个字符是否存在于字符串中,如果存在,也就是重复?Q2. 这里先不考虑重复,如果快速返回第一个字符?有没有感觉有点像先来先服务?对于一道题,如果没有思路原创 2020-09-04 23:12:56 · 177 阅读 · 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 · 644 阅读 · 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 · 238 阅读 · 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 · 89 阅读 · 0 评论 -
二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。红色数字是中序遍历的顺序。接下来,我们就假设,如果当前结点分别是1,2 ... 7,下一结点看有什么规律没?1 => 2 // 显然下一结点是 1 的父亲结点2 => 3 // 下一节点是当前结点右孩子的左孩子结点,其实你也应该想到了,应该是一直到左孩子为空的那个结点3 => 4 // 跟 2 的情况相似,当前结点右孩子结点的左原创 2020-08-30 11:37:34 · 214 阅读 · 0 评论 -
对称的二叉树:递归的使用
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。题解题目描述:给定一颗二叉树,判断此二叉树是否为对称二叉树。根据上图可知:若满足对称二叉树,必须满足:1. L->val == R->val2. L->left->val == R->right->val3. L->right->val == R->left->val设置一个递归函数isSame(r原创 2020-08-30 09:49:06 · 161 阅读 · 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 · 86 阅读 · 0 评论 -
剑指offer:序列化和反序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通原创 2020-08-26 23:23:28 · 78 阅读 · 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 · 96 阅读 · 0 评论 -
剑指offer:数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。方法一:查找排序法思路:得到输入数组arr,可以获得len的长度,因此需要获得arr的前len/2数据量获得排序。class Solution {public: vector<int>原创 2020-08-25 22:42:28 · 132 阅读 · 0 评论