
算法基础
王跃坤
算法爱好者/ACMer/前端工程师/软件设计师
展开
-
JAVA排序算法之将CMP写入Node
题目链接.import java.util.*;import java.math.*; public class Main{ public static class node implements Comparable{ int a,b; public node(int a,int b) { this.a=a; this.b=b; } public int compareTo(Ob原创 2021-02-24 20:20:35 · 197 阅读 · 0 评论 -
实验一 算法的时间复杂度和空间复杂度分析
目录实验目的:实验环境:实验内容:实验学时:实验过程:1.算法设计2.程序清单3.运行结果4.算法复杂度分析实验总结:实验目的:通过本次实验,了解算法复杂度的分析方法,掌握递归算法时间复杂度的递推计算过程。实验环境:硬件:PC机软件:windows操作系统,C语言实验内容:二路归并排序的算法设计和复杂度分析。实验学时:2实验过程:1.算法设计我们采用分治的算法将一个序列分成两个大概相等的小部分,对小部分重复调用该函数,使小部分完成排序,最后再合并两个小部分,完成排序。2.程序清单原创 2020-10-24 10:08:07 · 2201 阅读 · 1 评论 -
2020蓝桥杯省赛模拟赛
目录第一题:第二题:第三题:第四题:第五题:第六题:第七题:第八题:第九题:第十题:第一题:全排列问题+hashSet去重package A;import java.util.*;public class Main { /** * 问题描述 将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义。 请问,总共能排列如多少个不同的单词。答案提交 这是一道结果填空的题,你只需要算出结果后提原创 2020-10-11 12:21:22 · 3293 阅读 · 2 评论 -
归并 快排 逆序对 STL(牛客算法入门2)
归并快排逆序对考虑排序的交换次数即逆序对个数考虑排序过程中何时消灭了逆序对STL算法类:容器类:vector:迭代器:Iterator:栈和队列:map:原创 2020-05-27 23:42:47 · 291 阅读 · 0 评论 -
枚举 离散化 位运算 贪心(牛客算法入门1)
这里写自定义目录标题枚举前缀和差分、离散化枚举重点是减少枚举的次数1,选择合适的枚举对象2,选择合适的枚举方向3,选择合适的数据维护方法前缀和差分、离散化原创 2020-05-24 20:15:51 · 284 阅读 · 0 评论 -
前缀和与差分
这里写目录标题图示:公式:前缀和:差分:用途:差分例题:题目: [D. Constant Palindrome Sum](https://codeforces.com/contest/1343/problem/D).分析:AC代码:图示:a数组是b数组的前缀和b数组是a数组的差分公式:前缀和与差分两者互为逆运算前缀和:a[i]=a[i-1]+b[i]我们可以得出a[i]就是b数组...原创 2020-04-23 22:38:08 · 402 阅读 · 0 评论 -
简单01背包(DP)
目录01背包含义思路:举例:图解:代码:01背包含义从n个物品中选出一部分装在体积固定的包里。求可以装的最大价值是多少。每个物品有两个属性,价值及重量。思路:对n个物品进行01操作取最优解。不选当前这个物品选这个物品在 0 1 两种情况中取价值最大的。举例:假设有 5 个物品,装在重量上限为 8 的包裹里。下面是五个物品的属性:重量5, 价值1重量4, 价值2重量...原创 2020-04-19 18:47:46 · 478 阅读 · 0 评论 -
KMP算法
字符串匹配问题的算法时间复杂度O(m+n)空间复杂度O(m+n)最重要的是找到 next 数组next数组的含义是:如果当前字符不匹配,我应当何去何从?举个例子:我们给一个长度为 9 的字符串定义了一个长度为 10 的 next 数组红色数字的含义是:如果在当前位置出现不匹配,指针应当跳到那个位置。如果在绿色方框的位置出现不匹配,那么指针应该指向红色数字所指的位置,继续进行匹配。...原创 2020-04-07 22:04:31 · 254 阅读 · 0 评论 -
汉诺塔 问题 X
题目链接:汉诺塔 问题 X.题目:分析:与之前两题类似汉诺塔 问题 XIII.我们只需要找到当前步数下的状态,还有当前步数前一步的状态,检查一下两种状态的区别,就能知道结果了AC代码:package Two;import java.util.*;public class 汉诺塔X { public static ArrayList<Integer> arr...原创 2020-02-15 12:07:19 · 219 阅读 · 0 评论 -
汉诺塔 问题 IX
题目链接:汉诺塔 问题 IX.题目:分析:与汉诺塔 问题 VIII.非常类似,甚至稍微改几行代码就OK在递归调用的代码中当步数>2的(n-1)次方时 说明还有步数没走完当步数==2的(n-1)次方时 说明步数恰好走完当步数<2的(n-1)次方时 说明当前剩余步数不足以支持移动最大盘AC代码package Two;import java.util.*...原创 2020-02-15 11:17:14 · 314 阅读 · 0 评论 -
汉诺塔 问题 VIII
题目链接: 汉诺塔问题VIII.题目:分析:与汉诺塔VII类似 .题目要求找出当前步数下的状态我们知道:N个圆盘的总移动次数=2的n次方-1=(2的(n-1)次方-1)+ 1 +(2的(n-1)次方-1);所以我们可以采用递归运算的方式,根据步数确定当前最大的圆盘所在的位置当步数>=2的(n-1)次方时,圆盘在末位置否则,圆盘在初位置AC代码package T...原创 2020-02-15 10:54:38 · 271 阅读 · 0 评论 -
汉诺塔 问题 VII
题目链接:汉诺塔问题VII.题目:分析:题目要求我们确定当前状态是否是汉诺塔的正确移动状态对于N组数据,排列顺序有2的N次方,列举是不行的所以我们可以选择递归调用每次我们都能确定最大的盘子一定在初始位置或者目标位置以3个圆盘为例,abc三根柱子,八种状态分两步循环进行先判断3号圆盘是否在a,b其中一个内若在a,则判断2号圆盘是否在a,b其中一个内;若在b,则判断2号圆...原创 2020-02-15 10:19:08 · 453 阅读 · 0 评论 -
汉诺塔 问题 VI
题目链接:汉诺塔问题VI.题目:分析:题意是,把一个柱子的n个圆盘分散到三个柱子上,且小圆盘一定在大圆盘上边当n==1时,有三种情况,就是唯一的圆盘在第一根柱子唯一的圆盘在第二根柱子唯一的圆盘在第三根柱子当n>1时,对应三种情况,就是在n-1个圆盘的条件下,把新加来的圆盘放在第一根柱子在n-1个圆盘的条件下,把新加来的圆盘放在第二根柱子在n-1个圆盘的条件下,把...原创 2020-02-14 12:19:23 · 310 阅读 · 0 评论 -
汉诺塔 问题V
题目链接 汉诺塔问题V.题目:分析:同经典汉诺塔问题类似.不同的是本题恰需要知道每个圆盘所移动的次数添加一个二维数组用于记录不同圆盘数内各个圆盘的移动次数设有n个圆盘:当n==1时,仅仅需要移动一次当n>1时,有三步操作把n-1个圆盘移动到中间盘把最大盘移动到目标盘把n-1个圆盘移动到目标盘可以得到递推公式if(盘的数目==当前盘的编号){ arr[盘的数目...原创 2020-02-14 11:53:58 · 300 阅读 · 0 评论 -
汉诺塔 问题 IV
题目链接: 汉诺塔IV.题目:分析:和 汉诺塔III.类似,每次只允许移动到相邻的柱子上只不过添加了一个条件允许最大的盘子放在上边,我们可以把问题分为三步假设有n个盘子先把n-1个盘子放在中间柱上把最大的盘子放到目标柱把n-1个盘子放到目标住第一步,第三步分别需要n-1个圆盘移动一根柱子,即f(n-1)/2次第二步,需要将最大的圆盘移动两次则ans(n)=f(n-...原创 2020-02-14 11:23:40 · 324 阅读 · 0 评论 -
汉诺塔 问题 III
题目链接:汉诺塔III.题目:分析:同经典汉诺塔问题类似,只是每次只能移动到相邻圆盘只需要将经典的三步改成5步设共有n个圆盘将n-1个圆盘移动到目标盘将最大盘移动到中间盘将n-1个圆盘移动到初始盘将最大盘移动到目标盘将n-1个圆盘移动到目标盘第一步,第三步,第五步,都需要移动n-1个圆盘第二步,第四步都需要移动一次则可以抽象出函数f(n)=3*f(n-1)+2;A...原创 2020-02-14 10:58:11 · 428 阅读 · 0 评论 -
汉诺塔 问题 II
题目链接: HDUoj 汉诺塔问题II.题目:分析:这是汉诺塔问题的一个变体,原来的条件不变,把三根柱子换成四根柱子对于该问题:我们可以先找出上边连续的k个小盘,把他们放在一根柱子上,剩下的大盘不能覆盖在小盘上,只能按照经典汉诺塔问题排列在目标柱上,最后把小盘覆盖在大盘上即:F(n)=F(k)+ Math.pow(2, n-k) + F(k)对于小盘的移动次数,我们可以根据已知...原创 2020-02-14 10:11:06 · 844 阅读 · 0 评论 -
汉诺塔 问题 I
题目:汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?把一个大象装进冰箱需要三步打开冰箱门把大象放进去关上冰...原创 2020-02-13 12:21:12 · 307 阅读 · 0 评论 -
贪心算法——只追求当前利益最大化
贪心——只追求当前状态的利益最大化题目一:随机给你一个n元钱,向你购买m元的商品,要求用100元,50元,20元,10元,5元,1元的纸币找零(0<m<=n<2^30),请输出最少用几张纸币。import java.util.Scanner;public class tx1 { //随机给你一个n元钱,向你购买m元的商品,要求用100元,50元,20元,10元, //...原创 2019-10-16 08:52:09 · 945 阅读 · 0 评论 -
十大排序算法之选择排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。思路:与冒泡排序类似,进行n-1次循环,每次循环均为获取当前状态最大值的数组下标,根据下标找出最大值元素,与数组最右边元素(该位置依次向左迭代)交换完成一轮循环,即确定一个元素的位置。阻碍:在数组中,我们需要找一个变量用来记录当前状态数组中最大值的所在下标...原创 2019-09-02 09:07:47 · 261 阅读 · 0 评论 -
十大排序算法之插入排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。思路:就像在书桌上排列大小不同的书籍,大的放右边,小的放左边首先我们确定第一个数是固定的,然后我们取出第二个数与第一个数比较,比它大就放在它的右边,比它小就放在它的左边,然后取出第三个数,与最大的数比较,比它大就放在它的右边,比它小就与前边一个数比较,直到遇到一...原创 2019-09-03 15:22:53 · 174 阅读 · 0 评论 -
十大排序算法之希尔排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。介绍:希尔排序是插入排序的优化版本,当数据量很大时,插入排序需要一个一个的进行查找比较比较耗时,我们可以用一种方式使其大致趋于从小到大的排序状态,然后对其进行精细化的排序处理,思路:我们可以把一组大型数据分成几个区间,对每个区间里对应数字进行排序比如我们把a...原创 2019-09-04 16:41:33 · 251 阅读 · 0 评论 -
十大排序算法之归并排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。介绍:归并排序用到了分治的思想,顾名思义,分而治之一个长数组的排序不好搞定,我们可以把一个数组分为两个小规模的问题,一直切分下去,直到排序问题变为比较两个元素大小的问题我们只需要对两个元素进行排序后再进行合并即可完成任务。难点:归并排序的合并问题是最难以搞...原创 2019-09-05 18:14:25 · 431 阅读 · 0 评论 -
十大排序算法之快速排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。介绍:快速排序是改进的冒泡排序,快排和冒泡的关系就像是希尔和插入的关系一样希尔想怎样能够跳跃性的插入快排想一次冒大泡,虽然名字叫快速排序,但实际上也不快。。。思路:首先选定一端作为分割点,为参照物然后使用两枚指针,分别从左往右,从右往左进行查询从左往右查...原创 2019-09-09 18:41:36 · 377 阅读 · 0 评论 -
十大排序算法之堆排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。引入新知识:这个排序要涉及到数据结构中一个满二叉树的概念先说二叉树的概念:每个父节点最多拥有两个子节点的树为二叉树满二叉树的概念:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。...原创 2019-09-12 18:58:53 · 231 阅读 · 0 评论 -
十大排序算法之计数排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。介绍:这个应该是一种非常简单的排序算法。计数排序,顾名思义就是查一下有几个呗。思路:我们应该考虑给他们留一个多大的内存用来储存数字的数量定义两个变量min,max分别记录数组的最小值和最大值定义一个(max-min+1)长度的数组,遍历原数组,在其数字对应的...原创 2019-09-16 09:08:40 · 471 阅读 · 0 评论 -
十大排序算法之桶排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。介绍:在图书馆经常会有这种情况几十万本书,怎样才能进行快速有效的排序首先我们把这些书分类,一个分类代表一个桶当我们分好类,再进行小的分类,直到我们可以用简单算法进行排序的稳定状态思路:我们不知道一个分类会有多少本书,所以我们用数组来定义桶有些不太好用,最...原创 2019-09-20 18:30:51 · 482 阅读 · 0 评论 -
十大排序算法之基数排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。介绍:其实基数排序被讲得有些复杂了,很多人对于它的原理不明觉历。包括我本人,思考了很久才有些理解,不过也不知道是否正确从基数比较难以理解,可以先从最高位开始理解思路:如果有两个数,他们同时除以1000,则剩下的数大的在右边,小的在左边如果剩下的数相等,则把...原创 2019-09-20 19:02:37 · 281 阅读 · 0 评论 -
十大排序算法之冒泡排序
例题:对a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}排序要求从小到大排列。思路:要求n个数据从小到大排列,那我们只需要进行n-1次循环(当n-1个数排好之后,剩下的数一定是最小的),每次找出最大的一个放在右边就ok了。阻碍:在代码中比较大小只局限于两者比较,但是现在需要很多数进行比较大小,所以我们在内层加一个循环就ok了。(Ps...原创 2019-09-02 08:26:25 · 191 阅读 · 0 评论