
算法
c++算法题及算法
YSQ-911
这个作者很懒,什么都没留下…
展开
-
红黑树
红黑树: 性质: 1、每个节点是红的或者黑的 2、根节点是黑的 3、每个叶子节点是黑的 4、如果一个节点是红的,则它两个孩子都是黑的 5、对每个节点,从该节点到其子孙节点的所有路径上的包含相同数目的黑节点 6、每个叶子节点都隐藏,并且为黑色 应用: 1、Linux进程调度CFS 2、Nginx Timer事件管理 3、Epoll事件块的管理 红黑树: 数据结构: typedef int KEY_TYPE; typedef struct _rbtree_node { unsigned char原创 2020-05-11 21:15:50 · 194 阅读 · 0 评论 -
顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. //主要是要判断好边界条件 class Solution { public: vector<int> printMatrix(vector<vector<int>> matrix) {原创 2020-06-04 12:09:15 · 169 阅读 · 0 评论 -
包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 class Solution { public: void push(int value) { m_stack.push(value); if(m_min_stack.empty()){ m_min_stack.push(value);原创 2020-06-03 11:34:36 · 113 阅读 · 0 评论 -
两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNo原创 2020-05-25 11:53:13 · 100 阅读 · 0 评论 -
第一个只出现一次的字符
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数) class Solution { public: int FirstNotRepeatingChar(string str) { if(str.empty()) { return -1; } map<char,原创 2020-05-22 20:41:34 · 110 阅读 · 0 评论 -
把二叉树打印成多行
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vector<i原创 2020-05-22 17:24:05 · 118 阅读 · 0 评论 -
按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ //主要思路:结合栈是先进原创 2020-05-21 22:16:48 · 152 阅读 · 0 评论 -
对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ //主要思路是利用一个队列存储结点,类似于BFS查找,以根结点原创 2020-05-21 20:54:13 · 150 阅读 · 0 评论 -
二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ //也是利用广度优先搜索的方法解决,将结点存储在队列中,然后判断在同一高度下是否存在左右子树, //原创 2020-05-16 13:40:34 · 104 阅读 · 0 评论 -
剪绳子
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 // //动态规划:按照从下而上的顺序计算,也就是说我们先得到f(2),f(3),再得到f(4)...原创 2020-05-05 17:41:39 · 193 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, ...原创 2020-05-05 15:29:09 · 135 阅读 · 0 评论 -
左旋转字符串
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! //整体思路是先将n%len这部分先反转,然后再将len - n%len这部分反转,最后再整体反转 clas...原创 2020-04-28 19:26:50 · 131 阅读 · 0 评论 -
和为S的两个数字
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出。 //也是类似滑动窗口的解题办法但是这次窗口有范围限制 class Solution { public: vector<int> FindNumbersWithSum(vector<...原创 2020-04-28 12:36:51 · 99 阅读 · 0 评论 -
和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述:输出所有和为S的连续正数序列。序列内按照从小...原创 2020-04-27 12:44:58 · 143 阅读 · 0 评论 -
数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { if(data.size() == 0) { return 0; } int len = data...原创 2020-04-26 12:34:26 · 111 阅读 · 0 评论 -
矩形覆盖
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: //利用斐波那契数列求解: //当n为1时有一个2*1的小矩形,要组成2*1的矩形只有1种方法 //当n为2时有两个2*1的小矩形,要组成2*2的矩形只有2种方法 //当n为3时有三个2*1的小矩形,要组成2*3的矩形只有3种...原创 2020-04-22 12:13:48 · 146 阅读 · 0 评论 -
数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { ...原创 2020-04-20 15:50:07 · 199 阅读 · 1 评论 -
从上往下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ //利用广度优先遍历解决 class Solution ...原创 2020-04-20 14:40:11 · 108 阅读 · 0 评论 -
合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(L...原创 2020-04-17 13:02:34 · 102 阅读 · 0 评论 -
反转链表
输入一个链表,反转链表后,输出新链表的表头。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ //使用头插法解决 class Solution { public: ListNode* ReverseList(ListNode* ...原创 2020-04-16 13:03:09 · 96 阅读 · 0 评论 -
链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ //先让first指针走k - 1步,然后再让lastptr再和firstptr一起走。其中要判断k的值是否越界 class Solution...原创 2020-04-15 11:39:38 · 219 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 //利用插入排序的思想,先找到第一个奇数,然后在第一个奇数的基础下往前查找如果是偶数的话将该数插入到该偶数的 //前一个数,循环结束再将第一个奇数插入到查找偶数循环的最后一个数。 class Solution { public: ...原创 2020-04-14 18:47:39 · 84 阅读 · 0 评论 -
数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0 //利用快速幂求解 //快速幂: 快速幂:如计算经典的2^11;11的二进制为1011,2^3*1+2^2*0+2^1*1+2^0*1,2^(2^3*1+2^2*0+2^1*1+2^0*1)。 class Solution { public: ...原创 2020-04-14 15:58:18 · 97 阅读 · 0 评论 -
二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 class Solution { public: int NumberOf1(int n) { int count = 0; while(n) { count++; n = (n - 1) & n; ...转载 2020-04-13 14:21:41 · 91 阅读 · 0 评论 -
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解题思路: 题目给出每次可以跳上1级台阶,也可以跳上2级台阶所以给出推到过程如下: f(0) = 0 f(1) = 1 f(2) = f(2 - 1) + f(2-2) = f(1) + f(0) = 1 f(3) = f(3 - 1) + f(3 - 2) + f(3 - 3) = f...原创 2020-04-12 20:14:11 · 90 阅读 · 0 评论 -
跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 //此题思路还是和斐波那契数列类似只是初始值f(0) = 1、f(1) = 2;公式还是f(n) = f(n - 1) + f(n - 2) class Solution { public: int jumpFloor(int number) { if(n...原创 2020-04-10 12:57:19 · 94 阅读 · 0 评论 -
斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39 //利用自上而下的方法求解,利用循环先求解前两个数再计算第三个数。 //除此之外利用递归的话达不到性能要求但是代码比较简单后面附上递归代码。 //自上而下求解方法: class Solution { public: int Fibonacci(int n) { ...原创 2020-04-09 14:17:42 · 124 阅读 · 0 评论 -
旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 //主要思路:利用二分法进行查找,如果给出的数字中存在如{1,1,1,1,0,1}即前指针所指的值和后指针所指的值一 //...原创 2020-04-08 13:22:42 · 81 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 /** * Definition for binary tree * struct TreeNode { * int val; * Tr...原创 2020-04-07 12:45:27 · 94 阅读 · 0 评论 -
二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 //解题思路:把二维数组当成一个棋盘,因为题目给出的已知条件是吗,每行每列都是顺序排列, //所以先从第一列判断如果大于target列向后移,反之行向下移动再从行开始判断如此往复循环直到找到target /...原创 2020-04-02 18:18:46 · 288 阅读 · 0 评论 -
找第一个重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 //首先要判断给出的数组是否为空 //随后因为题目给出的数字范围在0到n-1内,所以不可能小于0也不可能小于数组长度-1,所以要每个...原创 2020-04-01 19:17:22 · 394 阅读 · 0 评论 -
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 // C++ //利用stack1模拟入队操作,出队先判断stack2是否为空,为空的话把stack1内的值转移到stack2中, //反之直接将stack2内的值pop出 class Solution { public: void push(int node) { stack1....原创 2020-03-31 13:16:15 · 151 阅读 · 0 评论 -
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 //如果头节点为空,返回空vector,反之遍历链表把元素压入栈中,最后判断栈不为空时弹出栈元素并将元素插入vector返回 /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * ...原创 2020-03-30 14:11:07 · 122 阅读 · 0 评论 -
二叉树的下一个节点
题目:给定一棵二叉树和其中的一个节点, 如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针, 还有个指向父节点的指针。 如果一个节点有右子树, 那么它的下一个节点就是它的右子树中的最左子节点。也就是说, 从右子节点出发一直沿着指向左子节点的指针, 我们就能找到它的下一个节点。例如, 图2.8中节点b的下一个节点是h, 节点a的下一个节点是f。 接着我们分析一个节点没...原创 2020-02-16 20:08:34 · 202 阅读 · 0 评论 -
重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果, 请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如, 输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6}, 则重建如图2.6所示的二叉树并输出它的头节点。二叉树节点的定义如下: 二叉树复现图: 代码: #include"BinaryTree.h"...原创 2020-02-16 18:40:11 · 87 阅读 · 0 评论