算法
文章平均质量分 52
BIG_GENERAL_DD
好好学习,天天向上.
展开
-
C++刷题//二维数组
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。class Solution {public: bool Find(int target, vector<vector<int> > array) { int row = array.size(); int col = ar...原创 2020-08-19 23:39:10 · 654 阅读 · 0 评论 -
DFS/BFS解决宝岛探险
DFS宝岛探险思路:注意此处我们把与小哼降落点上下左右相连接的陆地视为同一岛屿,0表示海洋,1~9表示陆地。计算小哼降落地所在岛的面积(即有多少格子)#include#includeusing namespace std;int a[51][51];//用来存储地图 int book[51][51],sum,n,m;void dfs(int x,int y)原创 2017-04-22 18:15:34 · 453 阅读 · 0 评论 -
深度优先搜索/广度优先搜索(解决小哈)
问题省略……深度优先搜索 (实例:解救小哈)思路:让小哼往右边走,直到走不通的时候再回到这里,再去尝试另一个方向。规定一个顺序,按顺时针方向来尝试(即按照右、下、左、上的顺序去尝试)。#include#includeusing namespace std;int a[51][51],book[51][51];int n,m,p,q,minn=99999999;vo原创 2017-04-22 18:07:59 · 820 阅读 · 2 评论 -
DFS/BFS(解决炸弹人)
问题省略……DFS解决炸弹人#include#includeusing namespace std;char a[20][21];//用来存储地图 int book[20][20],maxn,mx,my,n,m;int getnum(int i,int j) { int x,y,sum=0;//sum用来计数(可以消灭的敌人总数,所以初始化为0) //将坐标i、j复原创 2017-04-22 18:12:19 · 412 阅读 · 0 评论 -
最短路径之Floyed-Warshall算法
最短路径之-Floyed-Warshall算法//使用Floyed-Warshall能够求两点之间最短路径 或者指定一个点到其余各个顶点的最短路径//但是注意,此方法不能解决“负权回路”的图 #includeint main() { int e[10][10],k,i,j,n,m,t1,t2,t3; int inf=99999999; //正无穷定义为9999原创 2017-04-22 18:37:20 · 562 阅读 · 0 评论 -
C++中的hash_map和map的区别
1)为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典... 这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最转载 2018-01-29 11:03:02 · 395 阅读 · 0 评论 -
C++中的STL中map用法详解
C++中的STL中map用法详解Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,转载 2018-01-29 10:18:03 · 318 阅读 · 0 评论 -
链表
如何实现链表?在C语言中可以使用指针和动态分配内存函数malloc来实现。 指针int a; int *p;指针有什么作用?答案:存储一个地址。确切的说是存储一个内存空间的地址。p=&a;&叫做取地址符。这样p就获得(存储)了整形变量a的地址,可以理解成整形指针p指向了整形变量a。p指向a之后,我们可以用指针p来操作变量a了。#include i原创 2017-08-31 08:41:47 · 298 阅读 · 0 评论 -
栈
栈的实现只需要一个一维数组和一个指向栈顶的变量top即可。通过top来对栈进行插入和删除操作。 判断一个字符串是否是回文。若一个字符串是回文的,那么它必须是中间对称的,即求出mid。再把mid之前的字符全部入栈,此处的栈是用来存储字符,实现栈的数组类型是字符数组即chars[101];初始化栈很简单,top=0即可。入栈的操作top++;s[top]=x;(假设需要入栈的字符暂存在原创 2017-08-30 18:28:11 · 302 阅读 · 0 评论 -
约瑟夫问题
约瑟夫问题的两个O(log n)解法这个是学习编程时的一个耳熟能详的问题了:n个人(编号为0,1,...,n-1)围成一个圈子,从0号开始依次报数,每数到第m个人,这个人就得自杀,之后从下个人开始继续报数,直到所有人都死亡为止。问最后一个死的人的编号(其实看到别人都死了之后最后剩下的人可以选择不自杀……)。这个问题一般有两种问法:给出自杀顺序。不少数据结构初学书原创 2017-04-15 09:19:23 · 713 阅读 · 0 评论 -
Bellman-Ford的队列优化
Bellman-Ford的队列优化思想:每次仅对最短路程发生变化了的点的相邻边执行松弛操作。如何知道当前哪些点的最短路程发生变化?此处可以用一个队列来维护这些点、举例来说明 5 7 //第一行2个整数n、m,n为顶点个数,m为边的个数。接下来m行,每行3个数x、y、z,表示顶点x到顶点y//的边权值为z 1 2 21 5 102 3 32 5 7原创 2017-04-22 18:49:01 · 386 阅读 · 2 评论 -
最短路径之Bellman-Ford算法----解决负权边
最短路径之Bellman-Ford算法----解决负权边 //核心代码,只有4行,可以解决带有负权边的图。 for(k=1;k //最多包含n-1条边 for(i=1;i<=m;i++) //内循环循环了m次(m为边的个数),即枚举每一条边 if(dis[v[i]] > dis[u[i]+w[i]]) dis[v[i]] = dis[u[i]+w[i原创 2017-04-22 18:46:55 · 641 阅读 · 0 评论 -
最短路径之Dijkstra算法
最短路径之Dijkstra算法//求1号顶点到其余各个顶点的最短路径 //但是注意,此方法不能解决带有“负权”的图 #includeint main() { int e[10][10],dis[10],book[10],k,i,j,n,m,t1,t2,t3,u,v,min; int inf=99999999; //正无穷定义为99999999 (int可以存储最大原创 2017-04-22 18:40:40 · 503 阅读 · 0 评论 -
擒贼先擒王-并查集
并查集通过一个一维数组来实现,其本质是维护一个森林。刚开始时候,森林的每个点都是孤立的,也可以理解为每个点就是一颗只有一个结点的树,之后通过一些条件,逐渐将这些树合并为一颗大树。其实合并的过程就是认爹的过程。在认爹的过程中,要遵守“靠左”原则和“擒贼先擒王”原则。 在每次判断两个结点是否已经在同一颗树中的时候(一棵树其实就是一个集合),也要注意必须求其根源,中间父亲结点(小BOSS)是不能说明原创 2017-04-22 18:57:58 · 505 阅读 · 0 评论 -
数的划分 不同思路与解法
点击打开链接将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。dp[i][j]:把数i分成k分的方案数则:dp[i][j]=sum(dp[i-j][t])(t>=1&&t#include #include#include#include using namespace std;int dp[501][21];int main(){ int转载 2017-03-10 22:20:42 · 356 阅读 · 0 评论 -
递归-整数划分(1)
首先是递归解法整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。 如6的整数划分为 6 5 + 1 4 + 2, 4 + 1 + 1 3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1 2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1转载 2017-03-11 09:01:19 · 319 阅读 · 0 评论 -
动态规划-整数划分问题(2)
整数划分 --- 一个老生长谈的问题: 1) 练练组合数学能力. 2) 练练递归思想 3) 练练DP 总之是一道经典的不能再经典的题目: 这道好题求: 1. 将n划分成若干正整数之和的划分数。 2. 将n划分成k个正整数之和的划分数。 3. 将n划分成最大数不超过k的划分数。 4. 将n划分成若干奇正整数之和的划分数。 5. 将n划分成若转载 2017-03-11 09:02:36 · 361 阅读 · 0 评论 -
【动态规划】最长公共子序列与最长公共子串
3. 参考资料[1] cs2035, Longest Common Subsequence.[2] 一线码农, 经典算法题每日演练——第四题 最长公共子序列.[3] GeeksforGeeks, Dynamic Programming | Set 29 (Longest Common Substring).转载 2017-03-13 20:49:42 · 351 阅读 · 0 评论 -
动态规划 最大的算式
题目描述题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如:N=5, K=2,5个数字分别为1、2、3、4、5,可以加成:1*2*(3+4+5)=241*(2+3)*(4+5)=45(1*2+3)*(4+5)=45……转载 2017-03-15 19:26:13 · 815 阅读 · 0 评论 -
【最短路径】之Dijkstra算法
【最短路径】之Dijkstra算法最短路径单源最短路径:计算源点到其他各顶点的最短路径的长度全局最短路径:图中任意两点的最短路径Dijkstra、Bellman-Ford、SPFA求单源最短路径Floyed可以求全局最短路径,但是效率比较低SPFA算法是Bellman-Ford算法的队列优化Dijkstra算法不能求带负权边的最短路径,而SPFA算法、B转载 2017-03-17 21:53:52 · 859 阅读 · 0 评论 -
动态规划 (k好数)
动态规划:一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问转载 2017-03-15 19:54:46 · 453 阅读 · 0 评论 -
操作格子 (数的划分)
题目描述 Description将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。例如:n=7,k=3,下面三种划分方案被认为是相同的。1 1 51 5 15 1 1问有多少种不同的分法。输入描述 Input Description输入:n,k (6输出描述 Output Description转载 2017-03-25 14:34:13 · 349 阅读 · 0 评论 -
字符串对比
题目:给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等。比如 Beijing 和 Hebei 2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing 3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是转载 2017-03-25 14:16:58 · 594 阅读 · 0 评论 -
最短路径之Floyed算法
问题描述给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。输入格式第一行两个整数n, m。接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。输出格式共n-1行,第i行表示1号点到i+1号点的最短路。 样例输入转载 2017-03-15 19:31:48 · 559 阅读 · 0 评论 -
结点选择
又花了一个多小时把这道题重新整理了一遍,对于添加一条边的部分不太理解。对dfs函数中的 int i=head[x],v; v=edge[i].v; 语句不太理解题目:问题描述有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?输入格式第一行包含一个整数转载 2017-03-15 19:35:54 · 591 阅读 · 0 评论 -
堆-神奇的优先队列
如何建立堆?1)从空的堆开始,然后依次往堆中插入一个元素,直到所有的数都被插入(转移到堆中)为止。因为插入第i个元素所用的时间是O(logi),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下:n=0;for(i=1;in++;h[n]=a[i];siftup(n);} 2)把n个元素建立一个堆,首先将这n个节点以自顶向下,从左到右方式从1到原创 2017-04-22 18:54:43 · 311 阅读 · 0 评论 -
史上最全最丰富的“最长公共子序列”、“最长公共子串”问题的解法与思路
花了一天时间把一直以来的“最大子序列”、“最大递增子序列“、”最大公共子序列“、“最长公共子串”等问题总结了一下。其中参考了若干博文,都备注引用。首先子序列是指一个一个序列中,由若个数(字母)组成,然后从中任意删掉几个数(字母),保留剩下的数(字母)构成了一个序列,即称子序列。(或者从一个序列中,任意选取若干数或字符,按照这些数或字符原来的排序组成新的序列,即称子序列)子串是指在一个字符串原创 2017-07-31 20:12:32 · 29315 阅读 · 6 评论 -
排序算法(6)堆排序
堆排序是对简单选择排序的一种改进。堆排序有大顶堆(根结点最大)和小顶堆(根结点最小)之分。基于大顶堆的完全二叉树,其核心思想为:1)将原始序列构成一个堆。(建立初始堆)2)交换堆的第一个元素和堆的最后一个元素的位置;3)将移走(交换)最大值元素之后的剩余元素所构成的序列再转换为一个堆。4)重复上述过程(2)、(3)步n-1次问题:(1)、如何将原始序列构成一原创 2017-05-20 19:54:05 · 286 阅读 · 0 评论 -
排序算法(5)选择排序
基本思想:第i趟排序从序列的后n-i+1(i=1,2,……,n-1)个元素中选择一个最小的元素,与该n-i+1个元素的最前面那个元素进行位置交换,也就是与第i个位置上的元素进行交换,直到i=n-1。直观地说,每一趟的选择排序就是从序列中未排好顺序的元素中选择一个最小的元素,将该元素与这些未排好顺序的元素的第一个元素交换位置。void selectsort(keytype k[],int原创 2017-05-20 19:22:00 · 373 阅读 · 0 评论 -
排序(4)希尔排序
希尔排序又称为"缩小增量排序",是对插入排序的一种改进。基本思想:设定一个元素间隔增量gap,将参加排序的序列按这个间隔数gap从第一个元素开始依次分成若干个子序列。在子序列中再用其他排序方法,然后缩小增量gap,重新将整个序列按照新的间隔数gap进行划分,再分别对每个子序列进行排序。如此将“缩小增量gap——划分序列——将每个子序列排序”的操作进行下去,直到间隔数增量gap=1为止。原创 2017-05-20 17:08:46 · 355 阅读 · 0 评论 -
排序(3)直接插入排序
直接插入排序是一种最简单的方法,也被称为简单插入排序。基本思想:第i趟排序将序列中的第i+1个元素K(i+1)插入到一个已经按值有序的子序列(K1,K2……Ki)中合适的位置,使得插入后的序列仍然保持按值有序。一个包含n个元素的序列,需要n-1趟的直接插入排序就可以将原序列排列有序。算法如下:void insertsort(keytype k[],int n) { int原创 2017-05-20 16:53:38 · 351 阅读 · 0 评论 -
排序(2)快速排序
快速排序:是对冒泡排序的一种改进。(因为快排算法元素间的比较次数比较少,速度快,因而得名快排。在各种内部排序方法中,快排被认为是目前最好的一种排序方法。)快排之所以效率高,是因为每次元素的移动都是跳跃式的。每趟的排序都要指定一个基准点,把小于等于基准元素的所有元素都移动到基准元素前面,把大于等于基准元素的所有元素都移动到基准元素后面,元素移动的间隔距离较大,因此总的比较和移动次数减少,原创 2017-05-20 16:32:16 · 462 阅读 · 0 评论 -
排序(1)冒泡排序
冒泡排序:是一类具有“交换”性质的排序方法。冒泡排序可与此处一起比较点击打开链接一个包含n个元素的序列要进行n-1趟的冒泡排序,第i趟要将第1~n-i+1个元素中最大的元素交换到第n-i+1个位置上。这种排序方法就是通过序列中相邻元素之间的交换,使较小元素从序列的后端移动到序列的前端,使较大的元素从序列的前段移动到后端。冒泡排序算法:void bubblesor原创 2017-05-20 16:03:40 · 380 阅读 · 1 评论 -
lower_bound和upper_bound算法
ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回原创 2017-04-15 09:34:05 · 549 阅读 · 0 评论 -
十大编程算法助程序员走上高手之路
点击打开链接算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide转载 2017-02-21 21:02:39 · 317 阅读 · 0 评论