![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
总结
文章平均质量分 83
earlene_wyl
这个作者很懒,什么都没留下…
展开
-
刷题(11) 图和并查集
有空再补充最小生成树和最小路径树基本概念图的分类有向/无向加权/不加权两两组合,一共有4种图图的表示邻接表邻接链表数组, A【2】里面放的是 一个链表,是和节点2相连的节点适用于稀疏图,也就是顶点数大于边数的情况代码表示:vector<vector> adjsadjs【i】 是一个vector, 里面存着第i个节点所有边的另一个节点编号邻接矩阵二维矩阵,n个节点,nxn个矩阵。假如无向图, i和j相连,那么A【i】【j】, A【j】【i】 为tr原创 2021-12-30 21:17:37 · 202 阅读 · 0 评论 -
总结-卡特兰数
取个巧:实际碰到题目,如果你没有很好的推出h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)这个递推公式,但是假如h(1)=1,h(2)=2 ,h(3)=5,h(4)=14 ,那就当卡特兰数来做。两种计算方法代码:int foo1(int n) { if (n == 0) return 1; int res = 1; for (int i = n + 1; i <= 2 * n; ++i) res...原创 2019-05-17 16:22:48 · 158 阅读 · 0 评论 -
刷题(11)-图-(0)
一些概念的介绍。数据结构与算法总结——图 | 无境图的表示稀疏图(顶点数大于边数), 用邻接表(邻接链表数组, e.g A[2]里面放的是一个链表,是和节点2相连的节点) 稠密图(顶点数小于边数), 用邻接矩阵 (n个接点,nxn个矩阵,假如i和j相连,A【i】【j】, A【j】【i】 为true)图的分类有向/无向 加权/不加权上面两两组合, 所以一共可以有4种图图的邻接表 表示 一般给的输入是edges= [[1,0],[2,0],[3,1],[3,2]] 和 节点..原创 2021-10-16 17:54:13 · 130 阅读 · 0 评论 -
刷题系列总结
刷题(0)-二分查找_speargod的博客-CSDN博客刷题(1)-链表_speargod的博客-CSDN博客刷题(2)-栈,队列(1)总结_speargod的博客-CSDN博客刷题(2)栈,队列(2)-题目_speargod的博客-CSDN博客刷题(3)-排序(1)_speargod的博客-CSDN博客刷题(3)-排序(2)_speargod的博客-CSDN博客刷题(4)-位运算(1)总结_speargod的博客-CSDN博客、刷题(4)-位运算和数组-题目(1)_spe..原创 2021-10-14 15:32:17 · 152 阅读 · 0 评论 -
单向链表相交的一系列问题
单向链表相交的一系列问题问题描述总体代码1.有无环及入口2. 2个无环相交3. 2个有环相交全部代码问题描述两个单向链表,求第一个相交的点,实际这是3个问题!!!怎么判断 1个链表是否有环 并找到环的入口怎么找到2个无环单链表第一个相交的节点怎么找到2个有环单链表第一个相交的节点tips: (假如一个有环,一个无环,两个单向链表(因为是单向链表)不可能相交)总体代码先判...原创 2019-07-23 01:35:52 · 164 阅读 · 0 评论 -
算法6.堆与堆排序
堆:二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。一般用数组实现二叉堆当下标是i,左孩2*i+1,右孩2*i+2,父节点(i-1)/2,第一个非叶节点...原创 2019-03-01 00:01:55 · 268 阅读 · 0 评论 -
多态和动态绑定和RTTI(运行期类型识别)和RAII(以对象管理资源)
1.多态和动态绑定:动态绑定:在C++中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定。多态:多态性可以简单地概括为“一个接口,多种方法”多态目的:为了接口重用。对于动态多态来说就是不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。多态类型: a、编译时多态性:通过模板或者重载函数实现(子类实...原创 2019-08-29 00:31:15 · 530 阅读 · 0 评论 -
static和头文件,源文件放什么
目录头文件or源文件1、局部静态变量2、全局静态变量/普通的全局静态函数3、静态数据成员、成员函数(面向对象)头文件or源文件a)头文件应该放: 1)普通的全局函数声明 2)普通的全局变量声明 (必须是 extern int i这种方式//用来声明在另一...原创 2019-01-07 01:59:33 · 4075 阅读 · 0 评论 -
c++基础问题
目录指针与引用a)区别b)什么时候用指针?什么时候用引用?c)野指针,空悬指针智能指针C++11的特性(构造函数的初始化列表,智能指针,lambda)析构函数能否抛出异常c与c++面向对象的三个基本特征是:封装、继承、多态多态、 RTTI、RAII析构函数为什么要虚函数?构造函数为什么不能是虚函数?析构和构造函数体内能调用虚函数吗?C...原创 2019-09-20 00:52:26 · 568 阅读 · 0 评论 -
手写memcpy,strcpy,memset,strcat,strcmp
目录1)memcpy2)strcpy3) memset4)strcat5)strcmp1)memcpy函数声明:void *memcpy(void *dst, const void *src, size_t n); ////dst:目的地址, src:源地址 n:要拷贝的字节数但是标准memcpy(),对于地址重叠的情况,该函数的行为是未定义的。//If ...原创 2019-08-26 23:19:39 · 949 阅读 · 0 评论 -
刷题(5)-Trie树(4)
简介Trie树的实现//Trie树的实现struct Node{ bool is_end; Node *child[26]; Node():is_end(false){ for(int i=0;i<26;i++) child[i]=nullptr; }};class Trie {...原创 2019-08-13 10:19:33 · 119 阅读 · 0 评论 -
刷题(8)-背包问题(3)
目录背包问题1. 01背包采用空间压缩的代码(且用方案二的初始化方法):2.完全背包代码:3.多重背包3.1 朴素办法:3.2利用二进制进行优化O(V*n*logn(i))代码:3.3单调队列优化4.混合背包代码5.二维费用的背包问题01背包的二维费用代码:6.分组的背包问题01背包的分组背包代码7.01背包问题求...原创 2019-08-16 18:45:26 · 572 阅读 · 0 评论 -
C++ 并发问题
1.pthread_cond_wait的虚假唤醒什么是虚假唤醒?简单说就是wait这个函数返回了,但是它等的那个条件并不满足。为什么会这样? 有两种原因这个条件从来就没有满足过,wiat函数的返回不是因为别的线程调用signal或者broadcast把你唤醒,而是因为wait函数被信号中断。(虚假唤醒的一个可能性是条件变量的等待被信号中断。) pthread 的条件变量等...原创 2019-10-12 00:00:06 · 259 阅读 · 0 评论 -
刷题(11)-图(2)
图的表示: 稀疏图:邻接表(邻接链表数组) (e.g A[2]里面放的是一个链表,是和节点2相连的节点) 稠密图:邻接矩阵 (n个接点,nxn个矩阵,i-j相连,A[i][j], A[j][i] 为true)DFS(深度优先搜索):基本思路: 不撞南墙不回头 寻找离起点最远的顶点,只在...原创 2019-04-14 14:34:45 · 294 阅读 · 0 评论 -
刷题(5)-二叉查找树(3)
#ifndef CPP_BINARY_SEARCH_TREE_H#define CPP_BINARY_SEARCH_TREE_H#include <iostream>#include <stack>template <typename T>class BinarySearchTree{private: struct Node{ T val; Node *left, *right; explic...原创 2019-03-03 02:32:56 · 150 阅读 · 0 评论 -
刷题(4)-数组-题目(2)
1.2-sum 问题 (重要)(剑指offer 57)题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。还可以是打印所有的or打印所有不重复的解题思路:总的来说,就是两个指针,一个指向头部,一个指向尾部,向中间扫描O(N)大小指针题!,注意对于一个指针而言,不同时刻它的移...原创 2019-09-07 23:20:23 · 191 阅读 · 0 评论 -
刷题(10)-单调栈和单调队列
单调栈用途:O(n)时间,求一个数组的每个元素i,它的左边最近和右边最近比它小or大的元素。求左右两边最近比它大的,维护一个严格单调递减的栈(栈底到栈顶,是从大到小),while的时候栈顶元素小于等于当前元素,我们pop 求左右两边最近比它小的,维护一个严格单调递增的栈(栈底到栈顶,是从小到大),while的时候栈顶元素大于等于当前元素,我们pop每次都要从左到右遍历一遍,然后再从右...原创 2019-09-07 23:29:14 · 153 阅读 · 0 评论 -
面向对象的3个基本特征
面向对象的三个基本特征是:封装、继承、多态1. 封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。隐藏具体的内部实现细节,仅向外部提供简单的接口优点:减少耦合:可以独立地开发、测试、优化、使用、理解和修改 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块2.继承继承就是在父类的基础上,作出扩展,定义一个子类,而子类跟父类的关...原创 2019-09-19 15:07:51 · 5621 阅读 · 0 评论 -
剑指offer总结
剑指offer第1题~第10题【剑指offer】面试题3 数组中重复的数字【剑指offer】面试题4 二维数组中的查找【剑指offer】面试题5 替换空格【剑指offer】面试题6 从尾到头打印链表【剑指offer】面试题7重建二叉树【剑指offer】面试题8二叉树的下一个节点【剑指offer】面试题9用两个栈实现队列【剑指offer】面试题10斐波那契数列...原创 2019-10-11 23:55:55 · 167 阅读 · 0 评论 -
小和问题and逆序对
小和问题and逆序对题目描述:1. 小和问题:遍历数组,位于元素左边,且比该元素小的元素总和比如数组 [2 1 5] 对于2来说,左边没有比它小的,对于1来说也没有,对于5来说,有2和1比它小,所以总和32.逆序对:所谓逆序对就是[4,2],[4,1],[5,1]....., 那么就是左边比右边大,即右边比左边小的元素对对数。跟小和思路一样,但是是相反的 一个求...原创 2019-08-04 13:01:49 · 240 阅读 · 0 评论 -
刷题(8)-01背包的两种初始化问题(4)
前段时间看DP中的01背包问题,大部分内容都好理解,网上也有很多关于这个问题的博客,但自己提出的问题没有得到解决,只好苦思冥想,以求进一步理解。 首先是问题描述:给定n种物品和一背包,物品i的重量是wi,其价值是pi,背包的容量是M,问如何选择装入背包中的物品总价值最大? 这里有两种情况一种是将背包恰好装满,一种是不要求恰好装满。解决这样的问题的方式就是通过设置初始化来解决...原创 2019-08-16 01:09:59 · 172 阅读 · 0 评论 -
刷题(6)-哈希
1、哈希函数和哈希表步骤:第一步 用一个哈希函数(相同输入 相同输出 不同输入 输出均匀分布)把key转为数组下标第二步 处理碰撞冲突(1) 拉链法 (数组的元素是个链表)(2) 开放地址法 用数组的空位来处理冲突 (最简单的 线性探测法) 1)拉链法:拉链法使用链表来存储 hash 值相同的键,从而解决冲突。查找需要分两步,首先查找 Key 所在的链表,然...原创 2019-09-06 23:42:51 · 180 阅读 · 0 评论 -
KMP( O(n)时间,子字符串查找 )
简介:基本思路:在寻找的过程中,文本指针i,并不回退,而是去移动模式指针j的值,那这个移动到哪个位置是去查询next数组(ptr_p=next【ptr_p】)而next 【i】实际上是模式字符串里面以下标i-1为尾的子串,它的最长相同前缀和后缀的长度。next数组的构建是通过递推来进行的理解:左神p542详细理解:https://blog.csdn.net/v_july_v/a...原创 2019-08-02 01:58:39 · 134 阅读 · 0 评论 -
Manacher算法(一个字符串中找到最长回文子串)
零、预备知识 Manacher用于在一个字符串中找到最长的回文子串。 回文串:正着念和反着念一样,例如aabbaa,anna等。 注意子串与子序列的区别: 子串必须是在原字符中可以找到的。比如 " I am a student"。am是子串(当然也是子序列),但是aa就不是子串了(是子序列)。一、算法原理 Manacher算法通常人称马拉车算法,用于在一个字符...原创 2019-08-01 22:50:23 · 129 阅读 · 0 评论 -
求a,b的最大公约数
用辗转相除法确定两个正整数 a 和 b(a≥b) 的最大公因数gcd(a,b):当a %b ==0时,gcb(a,b)=b,否则gcd(a,b)=gcd(b,a %b)/* 最大公约数 */long gcd(long a, long b) { long t = a % b; while (t) { a = b; b = t; ...原创 2019-08-04 18:55:14 · 1719 阅读 · 0 评论 -
刷题(0)-二分查找
目录二分两种模板:1)模板一(后半段的开头):2)模板二(前半段的结尾):3)查找值相同的二分:查找值相同的二分小变种:找到第一个k和最后一个k的二分:二分两种模板:后下右 +1前 上左 -1首先必须满足一个条件,给的区间分成两段,一段全都满足条件,另一段全都不满足。然后根据你要找的是后半段的开头(模板一)还是前......原创 2019-08-04 14:35:18 · 178 阅读 · 1 评论 -
刷题(8)-动态规划(1)
动态规划通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。基本思想若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之...原创 2019-09-07 19:52:07 · 378 阅读 · 0 评论 -
刷题(8)-递归改动规(2)
怎么知道递归计算过程中存在计算重叠子问题:(下面的方法,我也似懂非懂,将就看吧)解答这个问题,最直观的应该是随便假设一个输入,然后画递归树,肯定是可以发现相同节点的。这属于定量分析,其实不用这么麻烦,下面我来教你定性分析,一眼就能看出「重叠子问题」性质。先拿最简单的斐波那契数列举例,我们抽象出递归算法的框架:def fib(n): fib(n - 1) fib(n...原创 2019-09-07 19:53:03 · 113 阅读 · 0 评论 -
快速选择(O(n),找到无序数组任意第k大的数字)
int quickselect(vector<int> vec,int aim){ if(vec.size()<1 || vec.size()<aim || aim<0) return -1; int left=0,right=vec.size()-1; int index=partition(vec,left,right); while(index...原创 2019-08-02 15:43:51 · 286 阅读 · 0 评论 -
刷题(11)-图-模板和dfs、bfs(1)
生成一张图的前期准备:class Edge;class Node{public: int value; int in; int out; list<Node*> next; list<Edge*> edges; Node(int value){ this->value = value; in = 0; out =0; }};cl...原创 2019-09-07 19:06:59 · 118 阅读 · 0 评论 -
刷题(5)-二叉树的四种遍历(2)
前中后递归版://二叉树的遍历:前序:中左右 中序:左中右 后序:左右中void recur(btnode *p){ //递归版 if(p != nullptr){ cout<<p->date<<endl; // 前序 count放这 recur(p->left); ...原创 2019-07-26 20:00:52 · 167 阅读 · 0 评论 -
刷题(3)-排序(2)
目录2. 归并排序 (稳定)3.冒泡排序(稳定)4.选择排序5.插入排序 (稳定)6. 希尔排序7. 堆排序8. 桶排序(不基于比较,稳定)8.1 计数排序8.2.基数排序(稳定)2. 归并排序 (稳定)复杂度: 时间O(NlogN) 空间O(N) 保证稳定性。思想:首先考虑一个数组 【first,mid】 【mid+1,last】都排好序了...原创 2019-08-04 12:38:22 · 560 阅读 · 0 评论 -
刷题(2)栈,队列(2)-题目
目录1.用两个栈实现队列(剑指offer 9 )2.包含min函数的栈(剑指offer 30 )3.栈的压入弹出顺序(剑指offer 31)(重要)4.滑动窗口的最大值(剑指offer 59 ) (重要)1.用两个栈实现队列(剑指offer 9 )题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类...原创 2019-09-05 20:18:17 · 613 阅读 · 0 评论 -
刷题(1)-链表
链表1.基本1.1套路1.2基本操作(表示,插入,删除)2. 反转链表题目描述a) 迭代思路代码1.基本1.1套路笔试中,不用在意空间复杂度,各种辅助结构直接上,越快写出越好面试中,追求时间复杂度O(n)空间复杂度O(1)1.2基本操作(表示,插入,删除)struct listnode{ int val; listnode *next; listnode(int _val,l...原创 2019-09-05 02:38:34 · 1885 阅读 · 0 评论 -
刷题(4)-位运算(1)总结
一.位运算主要看一,二章位运算总结十进制->二进制 正数:正常 除2取余 除2取余 负数: 补码 (先把它当成正数算2进制,然后各位取反,再+1) -1的补码全是11111 二进制->十进制 正数:正常 2的n-1次方 负数:同样 各位取反 ,再+1 然后算十进制,最后加个负号 (连着符号位 都取...原创 2019-09-06 20:57:03 · 277 阅读 · 0 评论 -
刷题(4)-位运算和数组-题目(1)
目录1.二进制中1的个数(剑指offer 15 )2.数值的整数次方 (剑指offer 16 )3.丑数(剑指offer 49 )4.求1-k以内的所有素数5.求1+2+3+...+n(剑指offer 64 )6.不用加减乘除做加法(剑指offer 65 )7.构建乘积数组(剑指offer 66)8.数组中重复的数字(剑指offer 3)...原创 2019-09-06 17:10:10 · 578 阅读 · 0 评论 -
刷题(2)-栈,队列(1)总结
栈,队列基础0.1 栈0.2 队列基础0.1 栈栈的特点栈(Stack)是一种线性存储结构,它具有如下特点:栈中的数据元素遵守”先进后出"(First In Last Out)的原则,简称FILO结构。限定只能在栈顶进行插入和删除操作。即同一端插入删除底层实现一般以数组或链表(单向链表、双向链表或循环链表)实现。tips:数组栈,栈顶为数组尾,链表栈采用头插法(插入在链表头...原创 2019-09-05 18:50:55 · 1931 阅读 · 0 评论 -
刷题(9)-并查集
并查集:并查集(Union-Find)算法介绍 - dm_vincent的专栏 - CSDN博客https://blog.csdn.net/dm_vincent/article/details/7655764并查集(Union-Find) 应用举例 --- 基础篇 - dm_vincent的专栏 - CSDN博客 https://blog.csdn.net/dm_vincent/art...原创 2019-08-13 23:07:48 · 135 阅读 · 0 评论 -
刷题(5)-树(1)
树的各种概念:树的完整概念二叉树节点表示:struct btnode{ int data; btnode *left; btnode *right;}几个性质:1. 根节点处于第1层,在二叉树的第i层上至多有2^(i-1)个节点(i>=1)2.深度为k的二叉树至多有2^k-1个节点 (2^0 + 2^1 +....+2^(k-...原创 2019-09-06 22:50:19 · 171 阅读 · 0 评论 -
刷题(3)-排序(1)
排序总结工程排序特点:1. 快速排序a) 三向切分快排,代码(主要)b)基本快排,随便看看吧c) 三数中值快排,且结合插入排序总结冒泡,插入,归并排序都是保证稳定性的,其他都不是现代操作系统很少使用堆排序,因为它无法利用局部性原理进行缓存,也就是数组元素很少和相邻的元素进行比较和交换。快速排序是最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。...原创 2019-08-02 14:16:55 · 270 阅读 · 1 评论