![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
牛客算法
无情的搬砖机器
不求甚解
展开
-
C++按照特殊字符分割字符串--日期排序
一、string中的find()函数原型:size_t find(const string& str,size_t pos = 0)const;功能:返回子字符串第一次出现的位置返回值:找到返回第一次出现的位置,否则返回string::npos例子:输入:stringing输出:3int main() { string str; string substr...原创 2020-02-22 08:58:18 · 1680 阅读 · 0 评论 -
烽火台问题(单调栈应用)
一、题目描述问题描述:给你一个数组,表示烽火台的信号值,烽火台是首尾相接的环形组成的,返回满足下列条件有多少对烽火台能两两通讯:1)相邻的烽火台能相互通讯2)不相邻的烽火台能相互通讯的条件为:两个烽火台经过的所有烽火台的信号值都不大于这两个中的最小那个。比如数组【1 2 4 3 5】相邻的【1 2】【2 3】【3 4】【4 5】【5 1】,不相邻的【5 4】可以通讯,因为中间...原创 2019-07-16 16:25:57 · 821 阅读 · 0 评论 -
窗口数组最大值及其应用
一、窗口数组最大值原型:描述:窗口大小为w,数组长度为n,求每个窗口数组的最大值,如下题返回一个数组为 [5 5 5 4 6 7]流程: 准备一个双端队列,存放窗口数组最大值的下标准,双端队列保证从左往右递增,不包括等于,1)窗口加数(R往右边移动):考察双端队列尾部和数组当前数的关系,尾部数大,直接从队尾入队,否则弹出,直到遇到尾部大于当前数的才将该数从队尾入队。...原创 2019-07-12 12:33:33 · 606 阅读 · 0 评论 -
Morris遍历
一、Morris遍思路Mirros遍历思路:cur 初始指向头结点1) 如果 cur 无左孩子,则cur向右移动 (cur = cur->right);2) 如果 cur 有左孩子,则找到其左子树最右的节点,姑且叫 mostright A: 如果mostright的right指针指向空,则让其指向cur,然后cur向左移动 (cur = cur->left);...原创 2019-07-16 20:54:45 · 295 阅读 · 0 评论 -
字符串拼接最小字典序
对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的。给定一个字符串数组 strs,同时给定它的大小,请返回拼接成的串。 ...转载 2019-07-19 17:13:09 · 1340 阅读 · 1 评论 -
基础08--贪心策略
贪心策略,看几个例题,很多靠经验,证明又复杂,先水一水一、金条切割这是题目的原问题是哈夫曼编码:子节点合并的代价就是子节点的和,如何构成一棵树使得代价最底。先将数组搞成小根堆,每一次从数组中拿出两个最小的,计算代价,然后将计算的代价扔回小根堆中,继续取出两个最小的如此循环直到堆里面只剩下一个元素。比如【10,20,30】,将数组搞成小根堆,取出两个小的就是10和20,得到代...原创 2019-07-24 17:56:40 · 180 阅读 · 0 评论 -
基础08--递归和动态规划
递归学会拆解问题:一、暴力递归问题1、递归:n!将n!分解为n*(n-1)!,然后继续分解...到12、汉诺塔将n个盘从from通过help挪动到to去,分解为将n-1个盘从from通过to挪动到help去,然后单独挪动最后一个盘,再将n-1个盘从help借助from挪动到to去即可。#include<iostream>#include<stdl...原创 2019-07-25 15:08:51 · 185 阅读 · 0 评论 -
大楼轮廓线
输入第一行一个数表示有N座大楼,后面依次输入N行,每一行表示大楼的起始点,终点和高度,输出为大楼轮廓信息如下图:第一行输出为3后面有三行输入表示大楼的信息:第二行为:1 3 3第三行为:2 4 4第三行为:5 6 1输出大楼轮廓信息:第一行:1 2 3第二行:2 4 4第三行:5 6 1#include<iostream>#in...原创 2019-08-06 16:57:43 · 348 阅读 · 0 评论 -
堆排序和第k小的数
一、堆排序:1、首先将数组建立成大根堆(heap_insert2、然后交换堆首和堆尾,将堆大小减一,将堆尾元素退出堆结构,排好一个数,然后重新维护大根堆(heapify3、循环第二个步骤直到堆中元素个数为04、堆排时间复杂度O(n*logn)#include<iostream>using namespace std;void swap(int arr...原创 2019-03-13 10:12:43 · 1063 阅读 · 0 评论 -
寻找最长公共子串
#include<iostream>#include<string>#include<vector>using namespace std;class Solution {public: string getLCS(string str1, string str2) { vector<vector<int>> r...转载 2019-09-10 22:04:58 · 587 阅读 · 0 评论 -
剑指ofer--和为S的数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。class Solution {public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> res;...转载 2019-09-12 17:33:02 · 116 阅读 · 0 评论 -
前缀树结构
1、构建前缀树2、扩充前前缀树的功能1) 寻找是否存在以某个字符串开头的字符2)寻找是否加入了某个字符串,则增加一个数据项即可,该数据项记录的就是以某个节点结尾的个数,0则表示没有。3) 请问有多少个字符串以某个字符串作为前缀,则再增加一个数据项,作为记录划过该节点几次即可实现该统计针对更多问题都可以自定义扩充前缀...转载 2019-07-18 20:09:16 · 302 阅读 · 0 评论 -
岛问题
回溯使用感染函数实现思路,假设已经有感染函数,然后遍历数组,当遇到1的时候就能将上下左右是1的都变成2,然后继续遍历如果遇到继续执行感染函数即可,直到遍历完毕。#include<iostream>#include<vector>using namespace std;class Solution {private: int directi...原创 2019-07-18 16:19:21 · 193 阅读 · 0 评论 -
前k小的数--BFPRT算法/堆的特性
寻找数组中第k小的数,如数组:5 3 4 2 7 9 6第一小的数为2,第二小的数为3,第七小的数为9.做到算法时间复杂度O(n).解法1:BFPRT算法1)分组。每五个一组,不满五个单独一组2)组内排序。3)将每组的中位数取出来作为一个数组4)递归bfprt过程,找出划分的num5)利用该num作为partation的划分num,如果目标小于partat...转载 2019-07-11 21:02:08 · 427 阅读 · 0 评论 -
单调栈
一、单调栈基础描述:给出一个数组arr,取每个元素离他最近的左边和右边比他大的元素,如数组【5 3 5 4 6】:思路:准备一个栈,入栈过程保证栈底到栈顶由大到小,相同则将下标压在一起。那么怎么保证从大到小呢?遍历数组,先将第一个数入栈,然后数组后面的每个元素入站前都和栈顶比较一下,如果比栈顶大则出栈,并开始收集数据:栈顶因谁出栈则谁就是栈顶元素右边离他最近且比他大的数,那么在栈中...原创 2019-07-12 21:47:40 · 216 阅读 · 0 评论 -
求最大子矩阵的大小(理解单调栈)
同源题目题目描述1:输入一个数组arr,其元素表示有多少个小矩形组成,如下图所示arr为【4 3 2 5 6】题目描述2:题目1解答思路:题目1思路:使用单调栈实现。保证栈底到栈顶从小到大,如果遇到比栈顶小的则出栈,记录信息:谁然栈顶元素出栈则谁就是当前扩不到的右边界题目1代码实现:#include<iostream&...原创 2019-07-13 20:12:20 · 318 阅读 · 0 评论 -
学习笔记—KMP算法
1、某个位置前面最长前缀和最长后缀的匹配长度:限定:前缀不能包含最后一个字符,后缀不能包含第一个字符。字符串 "abcabcd" 的最长前缀和最长后缀匹配的长度为3。当前缀和后缀取1的时候,前缀为a,后缀为c,不匹配;当前缀和后缀取2的时候,前缀ab,后缀bc,不匹配;前缀和后缀取3,前缀abc,后缀abc,匹配,那它是否最长的匹配长度? 继续看,前缀和后缀为4,前缀 abca,cabc,...原创 2019-07-06 18:25:55 · 379 阅读 · 0 评论 -
学习笔记—完全二叉树节点个数
题目:统计完全二叉树节点个数。观察完全二叉树的结构发现主要有如下几种:规律就是要么根节点的左子树为满二叉树,要么根节点的右子树为满二叉树。思路: 首先,如果当前节点的右子树最左边那个节点和二叉树的层数(深度)一样则说明该节点的左子树为满二叉树,如上图左边所示,的确根节点的右子树的最左边那个节点所在层数和二叉树的层数是一样的,那么整颗二叉树的节点个数就是左边满二叉树的节点+当前节点(根...转载 2019-07-03 20:41:57 · 585 阅读 · 0 评论 -
学习笔记—判断一颗二叉树是否为搜索二叉树或者完全二叉树
一、判断是否为搜索二叉树搜索二叉树定义:二叉树的中序遍历是升序序列利用非递归中序遍历版本:只需要将压入容器部分改变为判断当前值是否大于前一个即可,非递归版本中序遍历如下:vector<int> inOrder(TreeNode* root) { vector<int> v; TreeNode* p = root; stack<TreeNode*&g...原创 2019-07-03 13:17:52 · 433 阅读 · 0 评论 -
学习笔记—判断二叉树是否为平衡二叉树
大套路方法:递归(列出可能性,整理返回值的类型,按照同样的结果,得到子树的信息,整合所需信息往上返回)递归可以实现对二叉树的每个节点访问3次,上图二叉树以节点1为例,第一次会来到节点,然后走节点1的左子树,直到访问到空回到节点1(第二次访问),然后走节点1的右子树,直到访问到空回到节点1(第三次访问)。再入节点2,第一次来到节点2,然后去访问左子树,为空,返回节点2(第二次访问),然后去...转载 2019-07-03 11:57:15 · 293 阅读 · 0 评论 -
学习笔记—二叉树的序列化和反序列化
二叉树的序列化,如下所示二叉树的前序序列化为:1_2_4_#_#_5_#_#_3_6_#_#_7_#_#,其中#可以用于表示NULL一、实现前序序列化代码:代码很简单,和前序遍历差不多,最后返回一个string类型的字符串//先序遍历序列化string serialBypre(TreeNode* root) { if (root == NULL) return "#_";...原创 2019-07-02 21:24:27 · 325 阅读 · 0 评论 -
学习笔记—寻找二叉树的前驱节点和后继节点
二叉树前驱节点和后继节点:一个二叉树中序遍历中某个节点的前一个节点叫该节点的前驱节点,某个节点的后一个节点叫后继节点该题目中还有一个节点指向节点的父节点 parent,规定头节点的父亲节点的指针为空。struct TreeNode{ int val; struct TreeNode* left; struct TreeNode* right; struct...原创 2019-07-02 15:04:26 · 4961 阅读 · 1 评论 -
学习笔记—二叉树的非递归遍历
二叉树的定义如下:struct TreeNode{ int val; struct TreeNode* left; struct TreeNode* right; TreeNode(int x): val(x),left(NULL),right(NULL){ }};一、递归实现二叉树:(递归函数实际就是递归栈,所以后面非递归要借...原创 2019-07-01 17:55:24 · 296 阅读 · 0 评论 -
KMP算法应用
1、2018 京东校招笔试题 两个子串题目描述给定一个字符串s, 请计算输出含有连续两个s作为子串的最短字符串。 注意两个s可能有重叠部分。例如,"ababa"含有两个"aba".输入描述:输入包括一个字符串s,字符串长度length(1 ≤ length ≤ 50),s中每个字符都是小写字母.输出描述:输出一个字符串,即含有连续两个s作为子串的最短字符串。示例1输入ab...原创 2019-07-06 21:48:41 · 976 阅读 · 3 评论 -
马拉车算法
思路笔记:上述情况1和情况2又可以归结为:【i’的回文半径】和【R-i的距离】中小的那个就是i的回文半径。#include<iostream>#include<stack>#include<string>using namespace std;string manacherString(string str) { str...转载 2019-07-09 11:01:45 · 328 阅读 · 0 评论