![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
知识回顾
ZMST
这个作者很懒,什么都没留下…
展开
-
递归:n皇后问题
n皇后问题是指在一个n*n的国际象棋棋盘上放置n个皇后使得这n个皇后两两均不在同一行、同一列、同一条对角线上求合法的方案数【分析】多国采用组合数的方式来枚举每一种情况(即从n^2个位置中选择n个位置)那么将需要C^n n*n个枚举量 太大的数过不了换个思路考虑到每行只能放一个皇后每列也只能放一个皇后那么如果把n列皇后所在的行号依次写出那么就会是1~n的一...原创 2018-08-14 16:05:39 · 680 阅读 · 0 评论 -
string类的at函数
s.at(n)返回下标为n的元素的引用原创 2018-08-17 13:33:58 · 12853 阅读 · 1 评论 -
STL二分之lower_bound()和upper_bound()的用法总结
lower_bound()和upper_bound()都是利用二分查找的方法在一个排好序的数组中进行查找的在从小到大的排序数组中lower_bound(begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回数字的地址不存在则返回end通过返回的地址减去起始地址begin()得到找到数字在数组中的下标upper_bo...转载 2018-08-17 15:20:57 · 288 阅读 · 0 评论 -
链表学习小结
线性表是一类常用的数据结构,分为顺序表和链表顺序表可以简单理解为数组的概念按正常方式定义一个数组时,计算机会从内存中取出一块连续的地址来存放给定长度的数组而链表则使由若干个结点组成每个结点代表一个元素而结点在内存中的存储位置通常是不连续的struct node{ typename data; node* next;};链表分为带头结点的点和不带头结点的点...转载 2018-08-27 10:53:42 · 751 阅读 · 0 评论 -
快速排序学习小结
快速排序是排序算法中平均时间复杂度为O(nlogn)的一种算法【问题】对一个序列A[1]、A[2]、……、A[n],调整序列中元素的位置,使得A[1](原序列的A[1],下同)的左侧所有元素都不超过A[1]、右侧所有元素都大于A[1].例如对序列{5,3,9,6,4,1}来说,可以调整序列中元素的位置,形成序列{3,1,4,5,9,6}【思想】two pointers①...转载 2018-08-23 19:49:09 · 218 阅读 · 0 评论 -
一些高效技巧与算法
1、打表(空间换时间)一般将所有可能需要用到的结果事先计算出来,后面需要用时就直接查表获得①在程序中一次性计算出所有需要用到的结果,之后的查询直接取这些结果②在程序B中分一次或多次计算出所有需要用到的结果,手工把结果写在程序A的数组中,然后在程序A中就可以直接使用这些结果例如n皇后问题③对一些感觉不会做的题目,先用暴力程序计算小范围数据的结果,然后找规律,或许能发现一些...转载 2018-08-23 20:30:51 · 536 阅读 · 0 评论 -
最长回文子串
令dp[i][j]表示S[i]至S[j]所表示的子串是否是回文子串,是则为1,不是为0这样根据S[i]是否等于S[j],可以把转移情况分成两类:①若S[i]==S[j],只要S[i+1]至S[j-1]是回文子串,S[i]至S[j]就是回文子串,如果S[i+1]至S[j-1]不是回文子串,则S[i]至S[j]也不是回文子串②若S[i]!=S[j],那么S[i]至S[j]一定不是回文子...原创 2018-08-21 10:07:55 · 77 阅读 · 0 评论 -
背包问题(01 hdu——2602&&多重hdu——1114Piggy-Bank)
断断续续动态规划学了五天了都要,今天一定要吧背包问题解决完去学STL1、01背包问题:有n件物品,每件物品的重量为W[i],价值为c[i].现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大其中每种物品都只有1件【分析】令dp[i][v]表示前i件物品恰好装入容量为v的背包中所能获得的最大价值考虑对第i件物品的选择策略,有两种策略:①不放第i...原创 2018-08-21 14:34:25 · 276 阅读 · 0 评论 -
set的常见用法详解
set译为集合,是一个内部自动有序且不含重复元素的容器有时出现需要去掉重复元素的情况而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表在这种情况下就可以用set来保留元素本身而不考虑它的个数当然上面的情况也可以再开一个数组进行下标和元素的对应来解决但是set提供了更为直观的接口并且加入set之后可以实现自动排序头文件#include<set>...转载 2018-08-24 18:34:07 · 8516 阅读 · 1 评论 -
map常用用法详解
map翻译为映射,也是常见的STL容器在定义数组时(如int array[100]),其实是定义了一个从int型到int型的映射比如array[0]=25、array[4]=36就分别是将0映射到25、将4映射到36一个double型数组则是将int型映射到double型,如db[0]=3.14,double[1]=0.01但是,无论是什么类型它总是将int型映射到其他类型...转载 2018-08-24 20:05:04 · 60704 阅读 · 6 评论 -
并查集
并查集是一种维护集合的数据结构支持以下两个操作:①合并②查找基本操作:1、初始化一开始,每个元素都是独立的一个集合,因此需要令所有father[i]等于ifor(int i=1;i<=N;i++){ father[i]=i;}2、查找由于规定同一个集合中只存在一个根结点,因此查找操作就是对给定的结点寻找其根结点的过程int find...转载 2018-09-14 18:27:52 · 111 阅读 · 0 评论 -
查找并读取map中的元素
1、使用count检查map对象中某键是否存在对于map对象,count成员的返回值只能是0或1map容器只允许一个键对应一个实例所以count可有效地表示一个键是否存在2、读取元素而又不插入元素find操作返回元素的迭代器,如果元素不存在,则返回end迭代器如果希望当具有指定键的元素存在时,就获取该元素的引用否则就不在容器中创建新的元素那么就应该使用find...原创 2018-09-13 09:48:51 · 4995 阅读 · 0 评论 -
fabs(是浮点数)abs(返回的是整数)
记住!!!原创 2018-08-17 12:52:07 · 2782 阅读 · 2 评论 -
two pointers
【问】给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得它们的和恰好是M【分析】如果使用二重循环肯定会超时的时间复杂度O(n^2)int i=0,j=n-1;while(i<j){ if(a[i]+a[j]==m) { printf("%d %d\n",i,j); i++; ...原创 2018-08-22 20:28:03 · 158 阅读 · 0 评论 -
priority_queue的常见用法
其底层是用堆来进行实现的在优先队列中,队首元素一定是当前队列中优先级最高的那一个当然,可以在任何时候往优先队列里面加入push元素而优先队列底层的数据结构堆(heap)会随时调整结构使得每次的队首元素都是优先级最大的1、定义priority_queue<typename>name;2、容器内元素的访问和队列不一样的是,优先队列没有front()函数与ba...转载 2018-08-26 19:14:46 · 1506 阅读 · 0 评论 -
散列(hash)知识总结
散列是常用的算法思想之一应用如,给出N个正整数,再给出M个正整数问:M个数中的每个数是否在N个数中出现过如果N,M<=10^5,可以用遍历来做,但时间复杂度很大这时就可以用空间换时间即设定一个bool型数组hash Table[100010],这样在一开始读入N个正整数时就进行预处理代码:#include<cstdio>#define maxn...原创 2018-08-13 10:48:44 · 1153 阅读 · 0 评论 -
字符串hash初步(待补充进阶部分12.1)
如果key不是整数,设计散列函数:例子题目:如何将一个二维整点P的坐标映射为一个整数,使得整点P可以由该整数唯一地代表假设一个整点P的坐标是(x,y),其中0<=x,y<=Range那么可以令hash函数为H(P)=x*Range+y这样对数据范围内的任意两个整点p1,p2,H(p1)都不会等于H(p2)就可以用H(P)来唯一地代表该整点P接着可以通过证...转载 2018-08-13 11:18:02 · 236 阅读 · 0 评论 -
PAT——B1043(hash)
题目链接:#include<cstdio>#include<cstring>#include<iostream>using namespace std;string str;int HashTable[6]={0};char zm[6]={'P','A','T','e','s','t'};int main(){ getline(ci...原创 2018-08-13 15:43:00 · 150 阅读 · 0 评论 -
动态规划问题小结
动态规划(Dynamic Progamming,DP)是一种用来解决一类最优化问题的算法思想简单来说动态规划将一个复杂的问题分解成若干个子问题通过子问题的最优解来得到原问题的最优解tips:动态规划如何记录子问题的解来避免下次遇到相同的子问题时的重复计算以斐波那契数列代码为例有很多重复计算的过程为避免重复计算开一个一维数组dp用以保存已经计算过的结果其中...原创 2018-08-18 14:43:01 · 223 阅读 · 0 评论 -
STL之string
在C语言中,一般使用字符数组char str[]来存放数组但是使用字符数组有时会显得操作麻烦而且容易因经验不足而产生一些错误因此为了更方便地对字符串进行操作c++在STL中加入了string类型对字符串的需求功能进行了封装使得操作更方便,不易出错但是如果要使用string必须加上#include<string>using namespace std;...原创 2018-08-16 10:36:35 · 115 阅读 · 0 评论 -
二分学习小结
一个经典问题:如何在一个严格递增序列A中找出给定的数X。二分查找的高效之处在于,每一步都可以去除当前区间中的一半元素因此其时间复杂度是O(logn)优秀!!!需要注意的是:二分查找的过程与序列的下标从0开始还是从1开始无关#include<iostream>#include<cstdio>#include<algorithm>...原创 2018-08-16 15:24:50 · 103 阅读 · 0 评论 -
二分法拓展与快速幂
其实二分法不仅仅用来查找元素有很多用途譬如来求sqrt(2)的近似值求近似值其实就是这样一个问题的特例:给定一个定义在[L,R]上的单调函数f(x),求方程f(x)=0的跟还有快速幂的应用LL pd(LL a,LL b,LL m){ if(b==0) return 1; if(b%2==1) return a*pd(a,b...转载 2018-08-16 16:45:43 · 169 阅读 · 0 评论 -
pair常见用法详解
当想要把两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用pair可以很方便地作为一个代替品也就是说,pair实际上可以看作一个内部有两个元素的结构体且这两个元素的类型是可以指定的struct pair{ typename1 first; typename2 second;};1、pair的定义:头文件#include<util...转载 2018-08-26 13:15:05 · 16900 阅读 · 2 评论 -
algorithm头文件下的常用函数
【头文件】algorithm1、max(),min()与abs()如果想要返回三个数x、y、z的最大值,可以使用max(x,max(y,z))abs(x)x一定是整数fabs(x)浮点数2、swap()swap(x,y)用来交换x和y的值3、reverse()reverse(it,it2)可以将数组指针在[it,it2)之间的元素或容器的迭代器在[it,it2)范围...转载 2018-08-26 14:08:41 · 319 阅读 · 0 评论 -
栈的应用
后进先出【理解】每次可以把一本书放在箱子的最上方,也可以把箱子最上方的书拿出栈顶指针是始终指向栈的最上方元素的一个标记,当使用数组实现栈时,则是一个int*型的指针(数组下标从0开始),通常记为top而当使用链表实现栈时,则是一个int*型的指针栈中没有元素(即栈空)时令top为-1下面是常规操作①清空(clear)栈的清空操作将栈顶指针top置为-1,表示栈中...转载 2018-08-26 14:56:38 · 469 阅读 · 0 评论 -
队列的应用(queue)
队列是一种先进先出的数据结构理解为食堂打饭,先排队的人先打到【注意】队列总是从队尾加入元素,而从队首移除元素,并且满足先进先出的规则一般来说需要一个队首指针front来指向队首元素的前一个元素而使用一个队尾指针rear来指向队尾元素当使用数组来实现队列时,队首指针front和队尾指针rear为int型变量(数组下标从0开始)而当使用链表来实现队列时则为int...转载 2018-08-26 18:34:55 · 982 阅读 · 0 评论 -
queue的常见用法(deque不知道)
1、queue的定义queue<typename>name2、queue容器内元素的访问由于queue本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素,或是通过back()来访问队尾元素3、常用函数①push()push(x)②front()、back()分别获得队首元素和队尾元素③pop()令队首元素...转载 2018-08-26 18:47:07 · 852 阅读 · 0 评论 -
最小生成树
1、最小生成树及其性质最小生成树是在一个给定的无向图G(V,E)中求一棵树T使得这棵树拥有图G中的所有顶点且所有边都是来自图G中的边并且满足整棵树的边权之和最小【性质】① 最小生成树是树,因此其边数等于顶点数减1,且树中一定不会有环②对给定的图G但其(V,E),其最小生成树可以不唯一,但其边权之和一定是唯一的③由于最小生成树是在无向图上生成的,因此其根结点可以是这棵...原创 2018-09-15 15:35:30 · 517 阅读 · 0 评论