【算法】
理想主义的许佳佳
一位理想主义的程序员,祝你健康幸福。
展开
-
git diff的生成方式:myers diff算法
概述本文参考:https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/每个开发者多少都接触过git的diff功能,如下图:该功能能够展示出某个文件的改动信息,非常便于开发者的日常开发。本文将探讨下此功能实现的原理。myers diff 做了啥引用个例子a = ABCABBAb = CBABAC现在要找出ab之间的diff。仔细想一想,我们会发现其实两者之间的diff情况是有无数个的,比如可以找到以下几原创 2020-09-20 08:21:43 · 2285 阅读 · 0 评论 -
归并排序-数组中的逆序对
参考《剑指Offer》题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。输入:每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。 第二行包含n个整数,每个数组均为int类型。输出:对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。样例输入:4 7 5 6原创 2016-12-18 09:05:03 · 1344 阅读 · 0 评论 -
求第1500个丑数
参考《剑指Offer》题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。分析常规解法第一反应,我们肯定从1开始遍历,一直到找到第1500个丑数为止,如下:bool isUgly(int number) { while (number%2==0原创 2016-12-14 16:22:33 · 6596 阅读 · 0 评论 -
反转链表
参考《剑指Offer》题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表定义如下:struct ListNode{ int m_nkey; ListNode* m_pNext;};要点1、链表的建立中由于需要改变头指针指向的值,所以要用双重指针。 2、反转的逻辑主要是让后面结点指向前面的结点,但是如果仅仅这样操作,链表就断了,无法继续向后操作原创 2016-12-16 11:32:53 · 792 阅读 · 0 评论 -
斐波那契数列第n项的高效解法
参考书籍《剑指Offer》常见解法谈及斐波那契数列,我们直接就可以想到f(n)=f(n-1)+f(n-2)。于是做出如下解:long long Fibonacci(unsigned int n){ if(n<=0) return 0; if(n==1) return 1; return Fibonacci(n-1)+Fibonacci(n-原创 2016-12-13 09:21:13 · 5767 阅读 · 1 评论 -
算法基础-字符移位
题目小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 你能帮帮小Q吗?输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.输出描述: 对于每组数据,输出移位后的字符串。输入例子: AkleBiCeilD输出例子: kleieilABCD代码:(题目比较简单,就不带分析加长原创 2016-10-30 18:29:42 · 1255 阅读 · 0 评论 -
广度优先搜索,分支限界- ZOJ - 1136 Multiple
Descriptiona program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM (at least one), finds the smallest strictly positive multiple of N that has原创 2016-06-23 19:45:19 · 2364 阅读 · 0 评论 -
回溯法-经典 01背包问题
经典问题:给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大??分析1、如上图碰到一组数据,有两种可能:选或者不选,在树种分别由1,0表示。2、使用递归,在遍历完n个数的时候,判断最终的数是否比最佳价值大,如果比最佳价值大,就把值赋给bestv。代码:#include<stdio.h>int c=30; /原创 2016-06-22 11:37:08 · 36987 阅读 · 6 评论 -
和为s的两个数字
参考《剑指Offer》题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。解析分别记录数组的最小的和最大的两个数,由于数组本身是递增的,即数组第一个数和最后一个数。 如果两个数的和大于sum,那么后面一个数就向前挪,如果两个数的和小于sum,那么前面一个数就向后挪。如果前后两个数挪到了同一个位置,就表示不存在这样一个和。代原创 2017-03-23 18:39:07 · 727 阅读 · 0 评论 -
通过考试(概率dp)
题目描述小明同学要参加一场考试,考试一共有n道题目,小明必须做对至少60%的题目才能通过考试。考试结束后,小明估算出每题做对的概率,p1,p2,…,pn。你能帮他算出他通过考试的概率吗?输入输入第一行一个数n(1<=n<=100),表示题目的个数。第二行n个整数,p1,p2,…,pn。表示小明有pi%的概率做对第i题。(0<=pi<=100)输出小明通过考试的概率,最后结果四舍五入,保留小数点后五位原创 2017-04-08 09:16:03 · 1733 阅读 · 1 评论 -
字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。解析我们可以把字符串看成由两个部分组成:第一部分为它的第一个字符,第二部分为后面的所有字符。如此就可以递归。 当然递归的时候一定不要忘了回溯。结果代码#include<iostream>using namespace std;vo原创 2017-03-23 19:23:29 · 613 阅读 · 0 评论 -
SkipList详解
本文参考:《大数据日知录》概念SkipList是一种用来代替平衡树的数据结构。虽然在最坏的情况下SkipList的效率要低于平衡树,但是大多数情况下效率仍然非常高,其插入、删除、查找的时间复杂度都是O(log(N))。除了高效外,其实现和维护非常简单也是一大优势。SkipList的使用还是比较广泛的,比如在LevelDB中的MemTable就是使用SkipList实现的,Redis的...原创 2019-05-19 17:45:28 · 2457 阅读 · 0 评论 -
bitmap算法
本文参考:Bitmap 算法解释与应用概念BitMap 就是用一个 bit 位来标记某个key对应的 value。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。使用场景bitmap排序假设我们要对5个不重复的数(4,7,2,5,3)排序。确定最大值是7,数值范围是0~7,共8个数,需要8bit,即1字节。此时8个字节与集合中的数的对应关系为:00010000 ...原创 2019-05-19 16:15:30 · 957 阅读 · 0 评论 -
进制均值-进制转换+最大公约数
题目 尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题,现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示为三位数1、7、3,按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11,。 小B感兴趣的是原创 2017-07-23 08:34:16 · 686 阅读 · 0 评论 -
最大公共子串-构造回文
题目给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。输入例子:abcdagoogle输出例子:22解题思路1、把获取的字符串逆向转换成另一个字符串,两个字符串中查原创 2016-10-30 18:12:49 · 984 阅读 · 0 评论 -
墓地雕塑(Graveyard, NEERC 2006, LA 3708)
题目:在一个周长为10000的圆上等距分布着n个雕塑。现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布。这就需要移动其中一些原有的雕塑。要求n个雕塑移动的总距离尽量小。输入包含若干组数据。每组数据仅一行,包含两个整数n和m(2≤n≤1 000,1≤m ≤1 000),即原始的雕塑数量和新加的雕塑数量。输入结束标志为文件结束符(EOF)。输入仅一行,为最小总距离,精确到1原创 2016-06-17 11:39:43 · 2044 阅读 · 0 评论 -
小易记单词
题目: 小易参与了一个记单词的小游戏。游戏开始系统提供了m个不同的单词,小易记忆一段时间之后需要在纸上写出他记住的单词。小易一共写出了n个他能记住的单词,如果小易写出的单词是在系统提供的,将获得这个单词长度的平方的分数。注意小易写出的单词可能重复,但是对于每个正确的单词只能计分一次。输入描述: 输入数据包括三行: 第一行为两个整数n(1 ≤ n ≤ 50)和m(1 ≤ m ≤ 50)原创 2017-05-22 09:04:25 · 994 阅读 · 0 评论 -
工作安排(dfs深度优先搜索)
题目 现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作)。现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去。如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划。输入描述:原创 2017-05-20 10:12:32 · 869 阅读 · 0 评论 -
双核处理(动态规划的01背包问题)
题目 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间输入描述: 输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](102原创 2017-05-18 20:46:59 · 2111 阅读 · 0 评论 -
度度熊回家
题目 一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。 但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?输入 输入一个正整数N, N <= 50。 接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于100原创 2017-05-18 10:57:07 · 1127 阅读 · 0 评论 -
一句话弄懂常见二叉树类型
满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。 完全二叉树一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树。 平衡二叉树它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树 二叉搜索树它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不原创 2016-11-22 14:55:27 · 16789 阅读 · 0 评论 -
贪心-突击战(Commando War, UVa 11729)
题目:你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交待任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任务应尽早结束)。注意,不能同时给两个部下交待任务,但部下们可以同时执行他们各自的任务。输入包含多组数据,每组数据的第一行为部下的个数N( 1 ≤ N ≤ 1 000 ) ;以下 N 行每行两个正整原创 2016-06-22 09:28:58 · 1919 阅读 · 0 评论 -
动态规划-ZOJ 1 163 THE STAIRCASES
题目:分析:代码:#include<stdio.h>#include<string.h>int main(){ long long f[501][501];//f[i, j]表示i块积木堆成最高一排不超过j块积木的方案数 memset(f, 0, sizeof(f)); for(int i=0; i<501; i++) f[0][i] = 1; //f原创 2016-06-22 09:03:38 · 1107 阅读 · 0 评论 -
图的遍历算法-七巧板涂色
有如图所示的七巧板,试设计算法,使用至多4种不同的颜色对七巧板进行涂色(每块涂一种颜色),要求相邻区域的颜色互不相同,打印输出所有可能的涂色方案。算法设计:1、使用邻接矩阵表示七巧板的相邻情况2、使用蛮力法进行搜索代码:#include using namespace std;//三角板个数const int n=7;//邻接矩阵表,用来判断原创 2016-06-11 10:38:06 · 13598 阅读 · 6 评论 -
二分法-长城守卫(Beijing Guards, CERC 2004, LA 3177)
题目:有n个人围成一个圈,其中第i个人想要ri个不同的礼物。相邻的两个人可以聊天,炫耀自己的礼物。如果两个相邻的人拥有同一种礼物,则双方都会很不高兴。问:一共需要多少种礼物才能满足所有人的需要?假设每种礼物有无穷多个,不相邻的两个人不会一起聊天,所以即使拿到相同的礼物也没关系。 比如,一共有5个人,每个人都要一个礼物,则至少要3种礼物。如果把这3种礼物编号为1, 2, 3,则5个人拿到的礼物应分别原创 2016-06-25 09:25:11 · 2337 阅读 · 0 评论 -
贪婪-zoj 1029--MOVING TABLES
题目:输入输入数据有T组测试例,在第一行给出测试例个数T。 每个测试例的第一行是一个整数N(1≤N≤200),表示要搬运办公桌的次数。接下来N行,每行两个正整数s和t,表示一张桌子,是从房间号码s移到到房间号码t。输出每组输入都有一行输出数据,为一整数T,表示完成任务所花费的 最小时间。输入样例3 4 10 20 30 40 50 60 70 80 2 1 3 2 200 3原创 2016-06-24 12:55:53 · 1621 阅读 · 0 评论 -
求一组整数的第k小的数
题目:求一组整数的第k小的数输入:5 210 60 4 2 7输出:4解题思路:1、使用快速排序的思路解题。2、与快排不同的是,快排会在排序结束才会结束。此题也是从小到大排序,但是,只要找到第k小的数,就跳出递归。3、此题有一些小地方可以优化容易忽略,比如判断k是否会大于n,判断用i和j扫描时是否会越界,交换时是否会自己与自己交换等等。原创 2016-06-03 10:43:14 · 2698 阅读 · 0 评论 -
动态规划-ZOJ 1025-WOODEN STICKS
题目:现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模版的。 木工机需要的准备时间如下: (1)第一根木棒需要1min的准备时间; (2)在加工了一根长为l ,重为w的木棒之后,接着加工一根长为l ‘(l ≤ l’ ),重为 w’ ( w≤w’)的木棒是不需要任何准备时间的,否则需要一分钟的准备时间。原创 2016-06-24 09:25:42 · 1574 阅读 · 0 评论 -
残缺棋盘 android实现颜色填充
原“残缺棋盘”题目:残缺棋盘是一个2^k*2^个方格的棋盘,其中恰有1个方格残缺。图中给出,其中残缺部分用阴影表示。这样的棋盘称为"三格板",残缺棋盘问题就是用这四种三格板覆盖更大的残缺棋盘。再次覆盖中要求:(1)两个三格板不能重复。(2)三格板不能覆盖残缺棋盘方格,但必须覆盖到其他所有的方格。添加要求:使用图形化原创 2016-05-17 21:00:48 · 2871 阅读 · 1 评论 -
今年暑假不AC详细解析(贪心)
今年暑假不ACProblem Description“今年暑假不AC?”“是的。”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...”确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大原创 2015-11-01 10:48:24 · 3616 阅读 · 1 评论 -
ACM盒子游戏(博弈论)
盒子游戏时间限制:1000 ms | 内存限制:65535 KB难度:3描述 有两个相同的盒子,其中一个装了 n 个球,另一个装了一个球。Alice 和 Bob 发明了一个游戏,规则如下:Alice 和 Bob 轮流操作,Alice 先操作。每次操作时,游戏者先看看哪个盒子里的球的数目比较少,然后清空这个盒子(盒子里的球直接扔掉),然后把另一个盒子里的原创 2015-11-14 19:10:09 · 1861 阅读 · 2 评论 -
猴子选大王(约瑟夫环的使用,第一个不是报数人)
猴子选大王Descriptionn只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 k 个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。Input猴子总数n,起始报数的猴子编号k,出局数字m。(2=原创 2015-10-12 11:33:09 · 4186 阅读 · 0 评论 -
详细阐述约瑟夫环问题(报数出队问题)
约瑟夫环问题(Josephus) 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus)直接上代码:1 #include 2 int main() 3 { 4 int n, m, i, s = 0; 5 printf ("N M = "); 6 scanf原创 2015-10-05 16:51:20 · 4858 阅读 · 0 评论 -
图的遍历算法-马遍历棋盘
题目在n*m的棋盘中,马只能走日子,马从位置(x,y)处出发,把棋盘的每一点都走一次,且只走一次,找出所有的路径。demo实现棋盘设置为5*4,初始位置设置为(0.0)算法重点回溯在递归后方将坐标置为初始状态0。 当路径错误的时候,能够把路径恢复到走之前的状态。具体的实现,在注释中已经写得比较清楚。#include<iostream>using namespace std;//坐标固定的马有八种走原创 2016-06-13 11:18:45 · 8165 阅读 · 1 评论 -
贪婪法-勇者斗恶龙
题目:你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死 (即砍掉所有头)。村里有m个骑士可以雇佣,一个能力值为x 的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。 如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少? 注意,一个骑士只能砍一个头(且不能被雇佣两次)。输入格式输入包含多组数据。每组数据的第一行为正整数n和m (1≤n,m≤20 000);以下n行每行为一原创 2016-06-13 11:26:00 · 1404 阅读 · 1 评论 -
动态规划-最大子矩阵和(ZOJ 1074 TO THE MAX )
题目有一个包含正数和负数的二维数组。一个子矩阵是指在该二维数组里,任意相邻的下标是1×1或更大的子数组。一个子矩阵的和是指该子矩阵中所有元素的和。 本题中,把具有最大和的子矩阵称为最大子矩阵。例如,如下数组的最大子矩阵位于左下角,其和为15。 输入是N×N个整数的数组。第一行是一个正整数N,表示二维方阵的大小。接下来是N2个整数(由空格和换行隔开)。该数组的N2个整数,是以行序给出的。先是第一行原创 2016-06-21 15:04:22 · 14539 阅读 · 16 评论 -
中位数-输油管道问题
题目某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。 如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置? 给定n口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。输入第1行是一个整数n,表示油原创 2016-06-21 14:43:35 · 1957 阅读 · 1 评论 -
暴力枚举- uva11464 - Even Parity
题目:给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上、下、左、右的元素(如果存在的话)之和均为偶数。比如,如(a)所示的矩阵至少要把3个0变成1,最终如图(b)所示,才能保证其为偶数矩阵。 输入的第一行为数据组数T(T≤30)。每组数据的第一行为正整数n(1≤n≤15);接下来的n行每行包含n个非0即1的整数,相邻整数间用一个空格隔开。 对于每组数据原创 2016-06-20 10:48:10 · 1820 阅读 · 0 评论 -
蚂蚁-UVA 10881 - Piotr's Ants
题目:一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬, 要么朝右爬,速度为1厘米/秒。当两只蚂蚁相撞时,二者同时 掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向, 计算T秒之后每只蚂蚁的位置。 输入的第一行为数据组数。每组数据的第一行为3个正整数L, T, n(0≤n≤10 000);以下n行每行描述一只蚂蚁的初始位置, 其中,整数x为蚂蚁距离木棍左端的距离(单位:厘米)原创 2016-06-20 09:35:29 · 1578 阅读 · 0 评论 -
深度优先搜索-ZOJ 1047 Image Perimeters
大致题意给你一张图,图上有‘X’和‘.’。‘X’可以八个方向连通,这些连起来的‘X’成为一个块。问:输入一个坐标,这个坐标所在的块的周长是多少。 如图: 分析1、使用上下左右和对角线方向的深度优先搜索。 2、尝试几组数据,不难发现,在块中的’X’。’X’靠近边界,或者’X’的周围是’.’,那么周长就会+1。 如此,其实我们也可以简化问题,只需要在输入的数据上下左右都加上一行(列)’.’。这样原创 2016-06-19 10:41:56 · 1761 阅读 · 0 评论