基础算法
文章平均质量分 76
wow_bc
这个作者很懒,什么都没留下…
展开
-
【java】八数码问题
编号为1~8的正方形方块摆成3行3列,每次可以把与空格相邻的滑块移动到空格中,而原来的位置就成为了新的空格,给定初始局面和目标局面,计算出最少的移动步数。264137 58样例输入:2 6 4 1 3 7 0 5 82 6 4 1 3 0 5 8 72 6 4 1 3 7 0 5 88 1 5 7原创 2017-04-25 14:13:09 · 853 阅读 · 0 评论 -
【java】拓扑排序
输入m以及n个二元组(u,v),其中m表示元素个数,(u,v)表示表示元素u必须在元素v之前,输出从小到大可能的排序,任意一种即可。样例输入:4 30,12,13,22 21,00,1样例输出:3201false基于DFS的拓扑排序算法:import java.util.Scanner;import java.util.Arrays原创 2017-04-23 10:19:44 · 200 阅读 · 0 评论 -
【java】全排列 枚举子集
全排列:输入一个包含n个字符的字符串,输出该字符串的全排列。样例输入:abcab样例输出:abcacbbacbcacabcbaabbaimport java.util.Scanner;import java.util.Arrays;public class Main { public static void permutati原创 2017-04-24 16:05:11 · 1028 阅读 · 0 评论 -
【java】计数排序 基数排序
计数排序设待排序的n个数都是介于0~k之间的整数,当k=O(n)时,我们常采用计数排序,其时间复杂度为O(n)。计数排序的思想是,对于每一个元素x,统计出小于等于x的元素个数,从而直接确定它在排序后的位置。样例输入:101 2 11 33 11 23 6 9 2 6样例输出:1 2 2 6 6 9 11 11 23 33import java.util.Sc原创 2017-05-07 20:58:32 · 240 阅读 · 0 评论 -
【java】堆排序 最小的k个数
堆排序二叉堆是一颗完全二叉树,完全二叉树可以存放在一维数组中,如果将数组从0开始编号,则对a[i],它的左子树及右子树分别是a[2*i+1]和a[2*i+2]。二叉堆有大根堆和小根堆,是指每个结点的值大于(/小于)它们子结点的值。调整堆假设结点a[i]的左子树和右子树都已经是最大堆,将根节点为a[i]的树调整为最大堆。过程:将a[i]分别与左右子节点比较,然后与其中最大的一个交换位原创 2017-05-07 16:42:02 · 717 阅读 · 0 评论 -
【java】归并排序 逆序对数
归并排序按照分治三步法,介绍归并排序步骤:划分问题:把序列分成元素个数尽量相等的两半;递归求解:把两半元素分别排序;合并问题:把两个有序表合并成一个。前两部分容易完成,关键在于如何合并问题。归并排序代码:import java.util.Arrays;import java.util.Scanner;public class Main { public stat原创 2017-04-26 11:08:02 · 1213 阅读 · 0 评论 -
【java】选择区间 区间选点
选择区间数轴上有n个开区间(ai,bi),选择尽量多个区间,使得这些区间两两没有公共点。样例输入;51,45,63,46,74,5样例输出:1,44,55,66,7import java.util.Scanner;import java.util.ArrayList;import java.util.Collections;c原创 2017-04-26 15:27:08 · 2678 阅读 · 0 评论 -
【java】Huffman编码
输入n个字符以及它的频率,输出对应的Huffman编码。样例输入:6a,45b,13c,12d,16e,9f,5样例输出:a:0c:100b:101f:1100e:1101d:111import java.util.ArrayList;import java.util.Collections;class Node imp原创 2017-04-26 16:30:51 · 172 阅读 · 0 评论 -
【java】快速排序 数组中超过一半的数字
快速排序快速排序与归并排序一样,也是基于分治的思想,不同处在于①划分问题的方法在快速排序中,每次划分以第一个数字为基准pivot,将数组划分为两部分,左半部分的值全部=pivot;在归并排序中,每次划分把数组划分为元素个数尽量相等的两半。②合并问题的方法在快速排序中,划分问题的过程中,已经保证了部分顺序,不用在最后合并问题;在归并排序中,还需要在最后合并问题③时原创 2017-04-27 10:34:09 · 284 阅读 · 0 评论 -
【java】蛇形填数 螺旋填数
蛇形填数在n*n的方阵里填成蛇形,例如: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9原理:创建一个二维数组,将数组清零,用a[i][j]==0判断该位置是否已填数,用x,y记录下一个数的坐标,t记录填入的数字。样例输入:5样例输出:1原创 2017-04-27 11:53:02 · 3974 阅读 · 2 评论 -
【java】二分查找 求下界 求上界
二分查找要求数组必须是有序数组,输入数组长度n以及查找元素值key,然后输入n个元素,输出key所在的位置,不存在则输出-1.样例输入:8 231 4 14 23 55 66 77 884 61 4 7 8样例输出:3-1import java.util.Scanner;public class Main { public static void ma原创 2017-04-26 13:06:37 · 874 阅读 · 0 评论 -
【java】走迷宫最短路径
输入一个n*m的迷宫,1表示空地,0表示障碍物,输出从某个点到某个点的最短路径样例输入:6 51 1 0 1 11 0 1 1 11 0 1 0 01 0 1 1 11 1 1 0 11 1 1 1 10 00 3样例输出:DDDDRRUUURUimport java.util.LinkedList;import java.util.Que原创 2017-04-22 16:06:32 · 7404 阅读 · 1 评论 -
【java】黑白图像
输入一个n*n的黑白图像,统计其中黑色八连块的个数,0代表白,1代表黑。样例输入:61 0 0 1 0 00 0 1 0 1 00 0 0 0 0 01 1 0 0 0 01 1 1 0 0 00 1 0 1 0 0样例输出:3import java.util.Scanner;import java.util.Arrays;public cla原创 2017-04-22 12:07:38 · 721 阅读 · 0 评论 -
【java】数字三角形最长路径
有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数字的左下方和右下方各有一个数,如下图所示:每个结点的值代表它的权值,从第一行开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何走才能使得这个和尽量大。输入n代表三角形行数,然后输入每行各个结点的权值,样例输入:413 24 10 14 3 2 20样例输出:原创 2017-04-29 10:30:40 · 1945 阅读 · 0 评论 -
【java】嵌套矩形
有n个矩形,每个矩形可以用两个整数a,b表示,分别表示它的长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a例如:1,5可以嵌套在6,2内,但不能嵌套在3,4内。给出n个矩形,选出尽量多的矩形排成一行,使得除了最后一个之外,每一个矩形都可以嵌套在下一个矩形内。先输入矩形的数目n,紧接着输入n行,每行代表一个矩形,最后输出选出的矩形。样例输入:61,24,3原创 2017-04-30 14:01:32 · 686 阅读 · 0 评论 -
【java】硬币问题
有n种硬币,面值分别为V1,V2,...,Vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最大值和最小值。1分析:本题的本质也是DAG上的路径问题。原创 2017-04-30 14:20:08 · 1186 阅读 · 0 评论 -
【java】表达式树
根据数学表达式建立表达式树对于数学表达式a+b*(c-d)-e/f,可以表示成如下图所示的二叉树,要建立二叉表达式树,方法有很多,下面介绍一种:找到最后计算的运算符,然后递归处理。对于最后计算的运算符,+ -号在* /号之后计算,而对于相同优先级的运算符(+和-,*和/),我们规定最右出现的先计算(也可按其他顺序设计程序)。输入数学表达式,然后输出后缀表达式。样例输入:原创 2017-05-09 11:22:28 · 2606 阅读 · 0 评论 -
【java】最小生成树
航海家们在太平洋上发现了几座新岛屿,其中最大的一个岛已经连接到Internet,但是其它岛和主岛之间没有电缆连接,所以无法入网。我们的目的是让所有岛上的居民都能上网,即每个岛和主岛之间都有直接或间接的电缆连接。输入每两个岛屿之间的连接成本,要求给出最节省成本的方案。先输入边的数量n,然后输入n组数据,每组数据包括起点u,终点v,成本weight;样例输入:61 2 101 4原创 2017-05-09 16:13:34 · 1893 阅读 · 1 评论 -
【java】背包问题
部分背包问题有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以之取走一部分,价值和重量按比例计算。分析:贪心法即可求得最优解。贪心策略是优先拿“价值除以重量的值”最大的,直到重量和正好为C。先输入物品个数n以及背包总重量c,之后输入每个物品的重量及价值,输出选取的物品以及该物品的比例,最后输出最大的总价值。每个物品按输入顺序从1到n原创 2017-05-01 16:21:42 · 690 阅读 · 0 评论 -
【java】素数环
输入正整数n,把整数1,2,3,...,n组成一个环,使得相邻两个整数之和均为素数,输出从整数1开始逆时针排列。同一个环应该只输出一次。n样例输入:6样例输出:1 4 3 2 5 61 6 5 2 3 4import java.util.Arrays;import java.util.Scanner;public class Main { public stat原创 2017-04-24 18:19:45 · 555 阅读 · 0 评论 -
【java】N皇后问题
在一个N*N的棋盘上放置N个皇后,使她们互相不在同行同列,或同对角线,输出有多少种可能。样例输入:38样例输出:092import java.util.Scanner;public class Main { public static int search(int[] res,int cursor){ int sum=0; if(cursor==res.l原创 2017-04-24 17:19:38 · 221 阅读 · 0 评论 -
【java】二叉树重建
输入二叉树的后序遍历和中序遍历,输出它的先序遍历。样例输入:ACBFGED ABCDEFGCDAB CBAD样例输出:DBACEGFBCADimport java.util.Scanner;public class Main { public static StringBuffer str=new StringBuffer();原创 2017-04-22 12:00:20 · 204 阅读 · 0 评论 -
【java】最短路径算法
Dijkstra算法Dijkstra算法可用于求正权图上的单源最短路径,该算法适用于有向图和无向图。如果要求每两点之间的最短路径,需要调用n次Dijkstra算法,或者使用Floyd算法。该算法的伪代码:清除所有点的标号设d[0]=0,其他d[i]=INF循环n次{ 在所有未标号节点中,选出d值最小的节点x 给结点x标记 对于从x出发的所有边(x,y),更原创 2017-05-09 18:41:56 · 2396 阅读 · 0 评论