
算法与数据结构
介绍常见的算法与数据结构基础知识
可乐船长2020
一只头发茂盛的小码农
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
KMP算法的扩展应用
这一篇介绍一下关于经典的字符串匹配算法KMP的扩展应用在原始串的后面添加最少的字符生成一个长字符串,使长字符串包含两个原始串时间复杂度:O(N)/* @Author: lwl2020 @Date: 2020-5-29 @Description: 在原始串的后面添加最少的字符生成一个长字符串,使长字符串包含两个原始串*/#include <iostream>#include <string>#include <vector>using name原创 2020-05-30 12:05:02 · 242 阅读 · 0 评论 -
Manacher算法获取最长回文子串长度及其扩展应用
这一篇介绍一下获取字符串最长回文子串长度的Manacher算法,以及Manacher算法的扩展应用先介绍一个获取字符串最长回文子串长度的暴力解法时间复杂度:O(N^2)/* @Author: lwl2020 @Date: 2020-5-25 @Description: 获取字符串最长回文子串长度的暴力解法*/#include <iostream>#include <string>using namespace std;/* 暴力解法:原创 2020-05-26 17:26:56 · 282 阅读 · 2 评论 -
归并排序思想解决小和问题和逆序对问题
小和问题和逆序对问题是归并排序的算法的延伸应用,这篇博客将实现小和问题和逆序对问题的求解小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和,求一个数组的小和时间复杂度 O(N*logN),空间复杂度 O(N)/* @Author: lwl2020 @Date: 2020-5-20 @Description: 小和问题的实现*/#include <iostream>#include <vector>#include <c原创 2020-05-20 11:51:57 · 217 阅读 · 0 评论 -
简单消消乐
替换输入字符串的’b’和连续的’a’和’c’/* 'aadbbcc' => 'aadcc' 'abaca' => 'aa' 'aaabbccc' => '' */#include <iostream>#include <string>using namespace std;string removebAndac(string...原创 2020-04-30 18:24:41 · 388 阅读 · 0 评论 -
第K小的数值对(排序求解O(N * logN)、BFPRT求解O(N))
长度为N的数组arr,一定可以组成N^2个数值对例如:arr = [3, 1, 2],数值对有(3, 3)(3, 1)(3, 2)(1, 3)(1, 1)(1, 2)(2, 3)(2, 1)(2, 2),也就是任意两个数都有数值对,而且自己和自己也算数值对数值对的排序规则,第一维数据从小到大,第一维数据一样的,第二维数据也从小到大上面的数值对排序结果为:(1, 1)(1, 2)(1, 3)...原创 2020-04-26 11:12:38 · 209 阅读 · 0 评论 -
BFPRT算法实现(C++)
利用荷兰国旗问题的方法求解无序数组中第K小(或大)的数时间复杂度的期望值是O(N)BFPRT算法求解无序数组中第K小(或大)的数时间复杂度是严格的O(N)#include <iostream>#include <vector>#include <algorithm>using namespace std;class BFPRT{public: ...原创 2020-04-26 10:15:14 · 489 阅读 · 0 评论 -
无序数组中第K小(或大)的数(荷兰国旗问题方法)
在一个无序数组中找到第K小(大)的数—利用荷兰国旗问题的方法求解时间复杂度(期望值): O(N)#include <iostream>#include <vector>#include <ctime>using namespace std;void swap(vector<int>& arr, int n1, int n2) {...原创 2020-04-25 21:26:23 · 176 阅读 · 0 评论 -
按要求生成指定数组
输入一个int类型的值N,构造一个长度为N的数组arr并返回要求:对任意的i < k < j,都满足arr[i] + arr[j] != arr[k] * 2/* 思路:假定有一个数组满足上述条件,对这个数组进行奇变换和偶变换得到的数组同样符合条件, 将奇变换和偶变换得到的数组合并到一起也是满足条件的 */#include <iostream>#i...原创 2020-04-25 21:22:43 · 376 阅读 · 0 评论 -
子序列和的模值
小强有一个长度为n的整数数组a和一个数字m,他要在数组a中选择一个子序列,使得这个子序列的和相对m取模后的结果最大,子序列可以为空,请问这个结果最大为多少/* input: 第一行 两个正整数n, m 第二行 n个正整数a1,a2,a3,...,an 1 <= n <= 35, 1 <= m <= 1000000000, 1 <= ai <= ...原创 2020-04-24 16:27:47 · 603 阅读 · 0 评论 -
字符串无序匹配实现
给定长度为m的字符串aim,以及一个长度为n的字符串str,问能否在str中找到一个长度为m的连续子串,使得这个子串刚好由aim的m个字符串组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1/* 思路: 创建一个数组count用于统计aim中的字符串出现的频率, 利用滑动窗口在str上从左到右滑动,直到窗口走完整个str或者发现发现匹配的子串 ...原创 2020-04-22 01:30:28 · 813 阅读 · 0 评论 -
已知二叉搜索树(BST)的前序(或后序)遍历数组重建BST(改进版)
已知BST的前序遍历数组重建BST#include <iostream>#include <vector>using namespace std;struct TreeNode { TreeNode* left; TreeNode* right; int date; TreeNode(int value) : date(value), left(nul...原创 2020-04-21 22:36:24 · 468 阅读 · 0 评论 -
已知二叉搜索树(BST)的前序(或后序)遍历数组重建BST
已知BST的前序遍历数组重建BST#include <iostream>#include <vector>using namespace std;struct TreeNode { TreeNode* left; TreeNode* right; int date; TreeNode(int value) : date(value), left(nul...原创 2020-04-21 17:57:58 · 580 阅读 · 1 评论 -
最短循环节(KMP)实现
假设字符串str的长度为len,则str存在最小循环节,循环节的长度cycleLen为len-next[len],循环子串为str[0…len-next[len]-1]如果len可以被len - next[len]整除,则表明字符串str可以完全由循环节循环组成如果不能,说明还需要再添加几个字母才能补全,需要补的个数是循环个数cycleLen-len%cycleLen,需要补充的字符串为st...原创 2020-04-20 11:34:51 · 573 阅读 · 0 评论 -
伪中位数问题
n个数的伪中位数定义为从小到大排序后第[(n + 1)/2]个数。其中,[x]的意思是x向下取整。现在,给你n个数,你需要向其中增加最少的数,使得k成为最后这一组数的伪中位数。请问你需要加入数的最少数/* 输入第一行包含两个数n,k,意为原来数的个数和最后的伪中位数。 接下来一行输入n个数,空格隔开,代表原来的数 思路:将输入的数先进行排序,找到k这个数在原来的数中的位置...原创 2020-04-18 18:24:06 · 306 阅读 · 0 评论 -
单科成绩优秀奖问题
某学校的期末考试共有n个学生参加,考试科目共有m科,学校将会给一部分学生颁发单科成绩优秀奖,获奖学生需要满足的条件是某一科的成绩是所有学生中最高的或是最高的之一请问学校应该给多少名学生颁发单科成绩优秀奖/* 输入第一行包含两个正整数n和m,分别代表学生人数和考试科目数量。 (n,m <= 500) 接下来有n行,每行有m个正整数,每个正整数在1-100之间,中间用空格隔开,...原创 2020-04-18 10:22:47 · 1721 阅读 · 0 评论 -
KMP字符串匹配算法实现(C++)
#include <iostream>#include <string>#include <vector>using namespace std;void getNextArr(string& str2, vector<int>& next) { next.at(0) = -1; if (str2.length() ==...原创 2020-04-09 10:55:47 · 174 阅读 · 0 评论 -
判断镜像回文字符串
/* 给定一个字符换str(只包含字符'1'-'9'),判断这个字符串是不是镜像回文字符串 如一个字符串str与它的倒置字符串reverseStr的每一位都是镜像对应, 那么这个字符串就是镜像回文字符串 对应关系: 1 <==> 1 2 <==> 5 3 <==> 8 4 <==> 7 6 <==...原创 2020-04-08 21:30:19 · 571 阅读 · 0 评论 -
字符串在指定位置逆序
/* 给定一个字符串str,和一个整数i,i代表str中的位置, 将str[0..i]移到右侧,str[i+1..N-1]移动到左侧 思路:先部分逆序,再整体逆序*/#include <iostream>#include <string>using namespace std;void reversal(string& str, in...原创 2020-04-06 11:43:16 · 197 阅读 · 0 评论 -
String的构造函数、析构函数和赋值函数的实现(C++)
/* 编写类String的构造函数(普通构造和拷贝构造)、析构函数和赋值函数 */#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class String {public: String(const char *str = nullptr); String(co...原创 2020-04-05 22:16:04 · 207 阅读 · 0 评论 -
字符串相乘的实现(C++)
LeetCode 45. 字符串相乘/* 给定两个以字符串形式表示的非负整数 num1 和 num2, 返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式 思路: 1. 乘数 num1 位数为 M,被乘数 num2 位数为 N, num1 x num2 结果 res 最大总位数为 M+N 2. num1[i] x num2[j] 的结...原创 2020-04-03 22:46:41 · 1428 阅读 · 3 评论 -
strcpy函数的实现(C++)
/* 已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串*/#include <iostream>using namespace std;char* myStrcpy(char* strDest, const char* ...原创 2020-04-02 22:16:52 · 323 阅读 · 0 评论 -
字符串的按词倒序
/* 实现字符串的按词倒序功能(注意不是完全倒序), 如果函数输入为字符串“Nothing Is Impossible”,则输出为字符串“Impossible Is Nothing” 思路一: 先将整个字符串翻转,然后逐个单词翻转 思路二: 先逐个单词翻转,然后翻转整个字符串*/#include <iostream>#include <...原创 2020-04-02 21:43:23 · 815 阅读 · 2 评论 -
字符串常见算法实现(二)
LeetCode 344. 反转字符串/* 将输入的字符串反转过来 */void reverseString(vector<char>& s) { int r = s.size() - 1; int l = 0; while (l < r) { char c = s.at(l); s.at(l++) = s.at...原创 2020-03-29 17:59:58 · 126 阅读 · 0 评论 -
字符串常见算法实现(一)
这一篇开始介绍一下字符串常见的算法实现LeetCode 面试题 01.04. 回文排列/* 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一 通过计数的方式判断,回文串必定是有0或1个出现奇数次的字符 */class Solution {public: bool canPermutePalindrome(string s) { if (s...原创 2020-03-29 17:59:22 · 174 阅读 · 0 评论 -
链表常见算法实现(一)
LeetCode 206. 反转链表/* 实现单链表的反转 *//** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class S...原创 2020-03-26 14:58:08 · 169 阅读 · 0 评论 -
栈和队列常见算法实现(三)
滑动窗口的最大值/* 双端队列实现滑动窗口最大值的输出 如果双端队列不为空,并且双端队列尾部的值小于或等于当前数组中的值, 双端队列弹出尾部值,否则直接压入双端队列的尾部, 如果滑过窗口的长度大于等于窗口长度,双端队列前端的值压入返回数组, 判断双端队列是否超出长度限制,超出从前端弹出 */class SlideWindow {public: vector...原创 2020-03-26 11:21:21 · 239 阅读 · 0 评论 -
栈和队列常见算法实现(二)
递归实现栈的逆序/* get 方法获取栈底元素,reversal 方法实现将 get 方法获取的栈底元素再次压如栈中 调用 reversal 方法即可递归实现栈的逆序 */class ReversalStack {public: void reversal(stack<int>& s) { if (s.empty()) { return; } ...原创 2020-03-25 22:57:14 · 183 阅读 · 0 评论 -
栈和队列常见算法实现(一)
LeetCode 面试题 03.02. 栈的最小值/* 栈的最小值是通过两个栈实现的,一个栈(stackData)用于存放push进来的数据,另个栈(stackMin) 用来存放当前的最小值,如果stackMin为空或当前push进来的数据小于stackMin的栈顶元素 将push进来的数据放入stackMin中,否则将stackMin的栈顶元素压如栈中 */class Mi...原创 2020-03-25 21:31:26 · 266 阅读 · 0 评论 -
二叉树按层遍历并打印层信息
这篇介绍一下二叉树按层遍历并打印层信息的算法102. 二叉树的层次遍历算法一 vector<vector<int>> levelOrder(TreeNode* root) { if (root == nullptr) { return vector<vector<int>>(); }...原创 2020-03-01 17:39:48 · 193 阅读 · 0 评论 -
重建二叉树
这一篇介绍一下通过前序和中序、中序和后序遍历结果恢复二叉树LeetCode 105. 从前序与中序遍历序列构造二叉树 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return (preorder.size() == 0 || inorder.s...原创 2020-03-01 11:30:48 · 104 阅读 · 0 评论 -
相同的二叉树
这篇主要介绍一下判断两棵二叉树是否相同的方法LeetCode 100. 相同的树解释:通过二叉树的递归前序遍历方法实现的判断二叉树是否相同 bool isSameTree(TreeNode* p, TreeNode* q) { if (p == nullptr || q == nullptr) { return p == nullptr &am...原创 2020-03-01 10:36:03 · 250 阅读 · 0 评论 -
二叉树非递归遍历(二)
这篇介绍以下另一种风格实现二叉树的前序、中序和后序遍历struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int value) : val(value), left(nullptr), right(nullptr) { }};非递归前序遍历vector<int> biTree...原创 2020-02-23 21:43:59 · 102 阅读 · 0 评论 -
二叉树非递归遍历(一)
这篇介绍一下非递归的方式实现二叉树的前序、后序和层序遍历struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int value) : val(value), left(nullptr), right(nullptr) { }};非递归前序遍历vector<int> biTre...原创 2020-02-23 21:24:22 · 88 阅读 · 0 评论 -
桶排序(计数排序和基数排序)
/**@Author: lwl*@Date: 2019-12-19*@Description: 主要是实现桶排序(计数排序和基数排序)*/#include <iostream>#include <vector>#include <algorithm>#include <time.h>using namespace std;c...原创 2019-12-19 16:16:46 · 98 阅读 · 0 评论 -
二叉搜索树转有序双向链表(牛客)
/**@Author:lwl*@Date:2019-12-08*@Description:牛客网BSTree转有序双向链表,递归中序遍历 + 记住前一个节点*/class Solution {public: TreeNode* preNode = NULL; TreeNode* res = NULL; void Process(TreeNode* pRootOf...原创 2019-12-08 16:51:37 · 112 阅读 · 0 评论 -
归并排序、快速排序和堆排序(含对数器)
/**@Author: lwl(参考牛客左神Java代码)*@Date:2019-12-07*@description:C++实现归并排序 & 快速排序 & 堆排序,含对数器*/#include <iostream>#include <algorithm>#include <vector>#include <string&g...原创 2019-12-07 21:43:05 · 100 阅读 · 0 评论 -
冒泡排序、选择排序和插入排序(含对数器)
/**@Author: lwl*@Date: 2019-12-07*@Description: C++ 实现冒泡排序 & 选择排序 & 插入排序,含对数器*/#include <iostream>#include <algorithm>#include <vector>#include <time.h>usin...原创 2019-12-07 21:25:24 · 108 阅读 · 0 评论