
算法(精简)
为了一些一起练习OJ的小伙伴们
普通网友
这个作者很懒,什么都没留下…
展开
-
小白也能看懂的约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 结果+1即为原问题的解。如果还看不懂问题,杨帆兄简单易懂的约瑟夫环PS:首先附上代码这个代码是一共n个人,每次淘...原创 2020-05-03 17:28:51 · 10078 阅读 · 24 评论 -
Java写算法题中那些影响你效率的细节(关于暴力破解算法题的细节处理)
QQ讨论群:99979568 多交流才能进步暂时写到这里,有不懂的欢迎评论, 如果有什么其他提高效率的细节,欢迎评论或者私信我,小编一定努力学习,争取早日分享给大家判断奇数偶数两个变量的值交换在使用数组长度的时候需要注意做OJ或者控制台输入时可以优化的地方 求质数的方法(欧拉筛)循环中一定不能进行的操作循环中一定要会的操作(goto语句)声明变量需要注意的地方...原创 2020-05-03 11:42:03 · 11474 阅读 · 32 评论 -
Java实现欧拉筛与花里胡哨求质数高级大法的对比
我也不清楚这是什么高级算法,欧拉筛是昨天有位大佬,半夜无意间告诉我的欧拉筛:主要的含义就是我把这个数的所有倍数都弄出来,然后下次循环的时候直接就可以跳过了import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;public c...原创 2020-03-08 17:27:40 · 12065 阅读 · 20 评论 -
最简短的巴什博弈
巴什博弈在一共有n个物品的情况下,每个人可以拿1-m个物品时,谁拿到最后一个就是赢家。当n%(m+1)!=0的情况下,先手必赢如果我拿 1个,另一个人可以拿m个我拿两个,另一个人可以拿m-1个。。。以至于,在这种情况下先手必赢...原创 2020-03-05 15:48:25 · 12080 阅读 · 27 评论 -
通俗易懂的高效率求质数
通俗易懂的求质数,效率还贼鸡儿高,~滑稽原文地址,很详细,是个大佬import java.util.ArrayList;import java.util.List;public class 求质数 { //通俗易懂的求质数 public static void main(String[] args) { //存放质数得list List<Integer> lis...转载 2020-02-25 17:40:26 · 12190 阅读 · 20 评论 -
最牛掰得冒泡排序,不接受任何反驳
大佬的冒泡排序让我细细得品了一天点击:原文比较详细import java.util.Arrays;public class 最牛冒泡排序 { public static void main(String[] args) { int array [] = {5,7,2,15,10,23,11}; // 用来交换的临时数 int temp = 0; ...转载 2020-02-25 17:28:42 · 12515 阅读 · 23 评论 -
java实现子集和问题
1 问题描述求n个正整数构成的一个给定集合A = {a1,a2,a3,…,an}的子集,子集的和要等于一个给定的正整数d。请输出所有符合条件的子集。2 解决方案2.1 全排列思想求解方法1:首先,将子集保存在一个数组链表中,每次往链表中添加一个元素;从空集增加到最大集,再回溯,递归返回的时候,再将链表最后一个元素从子集移出;这样就实现了,元素在与不在子集中,这两种状态。注意,每次加入...原创 2019-07-22 21:49:53 · 13343 阅读 · 23 评论 -
java实现哈密顿回路问题
1 问题描述什么是哈密顿回路?引用自百度百科:哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径。现在本文要解...原创 2019-07-22 21:46:29 · 13396 阅读 · 18 评论 -
(Java实现) N皇后问题
n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行、纵行或斜线上。蛮力法思想: 解决n皇后问题的思想本质上就是蛮力法,生成所有可能的摆放情况,并判断该情况是否满足要求,我们以树结构来表示解决问题的方法。以4*4的棋盘为例,第0层的根节点为空白的棋盘,第1层为只在棋盘的第一行摆放的四种...原创 2019-06-02 08:34:02 · 18718 阅读 · 13 评论 -
java实现SPFA算法
1 问题描述何为spfa(Shortest Path Faster Algorithm)算法?spfa算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求含负权图的单源最短路径,且效率较高。(PS:引用自百度百科:spfa是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算...原创 2019-07-22 21:43:16 · 13099 阅读 · 22 评论 -
java实现BellmanFord算法
1 问题描述何为BellmanFord算法?BellmanFord算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求取含负权图的单源最短路径。BellmanFord算法思想:第一,初始化所有点。每一个点保存一个值,表示从原点到达这个点的距离,将原点的值设为0,其它的点的值设为无穷大(表示不可达)。第二,进行循环,循环下标为从1到...原创 2019-07-22 21:41:15 · 13609 阅读 · 21 评论 -
java实现Floyd算法
1 问题描述何为Floyd算法?Floyd算法功能:给定一个加权连通图,求取从每一个顶点到其它所有顶点之间的最短距离。(PS:其实现功能也称完全最短路径问题)Floyd算法思想:将顶点i到j的直接距离依次与顶点i到顶点j之间加入k个中间节点之后的距离进行比较,从中选出最短的一组距离,即为顶点i到顶点j的最短距离,然后重复上述步骤求取其它顶点之间的最短距离。2 解决方案2.1 使用Floy...原创 2019-07-22 21:39:28 · 13480 阅读 · 26 评论 -
java实现Dijkstra算法
1 问题描述何为Dijkstra算法?Dijkstra算法功能:给出加权连通图中一个顶点,称之为起点,找出起点到其它所有顶点之间的最短距离。Dijkstra算法思想:采用贪心法思想,进行n-1次查找(PS:n为加权连通图的顶点总个数,除去起点,则剩下n-1个顶点),第一次进行查找,找出距离起点最近的一个顶点,标记为已遍历;下一次进行查找时,从未被遍历中的顶点寻找距离起点最近的一个顶点, 标记...原创 2019-07-22 21:37:26 · 27603 阅读 · 26 评论 -
java实现Kruskal算法
1 问题描述何为Kruskal算法?该算法功能:求取加权连通图的最小生成树。假设加权连通图有n个顶点,那么其最小生成树有且仅有n - 1条边。该算法核心思想:从给定加权连通图中,选择当前未被选择的,不能形成回路且权值最小的边,加入到当前正在构造的最小生成树中。2 解决方案2.1 构造最小生成树示例下面请看一个具体示例:给定一个加权连通图,其包含5个顶点,分别为:1,2,3,4,5。包...原创 2019-07-22 21:30:54 · 14783 阅读 · 23 评论 -
java实现求逆序对
1 问题描述给定一个随机数数组,求取这个数组中的逆序对总个数。要求时间效率尽可能高。那么,何为逆序对?引用自百度百科:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。...原创 2019-07-22 21:24:41 · 13724 阅读 · 22 评论 -
java实现Prim算法
1 问题描述何为Prim算法?普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里...原创 2019-07-22 20:57:51 · 17530 阅读 · 25 评论 -
Java实现最优二叉查找树
1 问题描述在了解最优二叉查找树之前,我们必须先了解何为二叉查找树?引用自百度百科一段讲解:二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于或等于...原创 2019-07-21 22:14:24 · 13764 阅读 · 20 评论 -
Java实现荷兰国旗问题
问题描述现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球、白球、蓝球。这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗。2 解决方案为了方便编码与讨论,用数字0表示红球,数字1表示白球,数字2表示蓝球,所以最后生成的排列为0,1,2。解决该问题,只需先设定三个用于指定元素的下标指针(PS:在Ja...原创 2019-07-21 22:04:45 · 12233 阅读 · 22 评论 -
Java实现硬币收集问题
1 问题描述在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格。每一步,机器人可以从当前的位置向右移动一格或向下移动一格。当机器人遇到一个有硬币的单元格时,就会将这枚硬币收集起来。设计一个算法找出机器人能找到的最大硬币数并给出相应的路径。2 解决方案2.1 动态规划法本文编码思想参考自《算法设计与分析基础》第三版...原创 2019-07-21 22:00:16 · 12153 阅读 · 18 评论 -
Java实现找零问题
1 问题描述现需找零金额为n,则最少需要用多少面值为d1 < d2 < d3 < … < dm的硬币?(PS:假设这m种面值d1 < d2 < d3 < … < dm的硬币,其中d1 = 1,且每种硬币数量无限可得)2 解决方案2.1 动态规划法本文编码思想参考自《算法设计与分析基础》第三版,具体讲解如下:package com.liu...原创 2019-07-21 21:55:58 · 13724 阅读 · 26 评论 -
Java实现台阶问题
1 问题描述一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法。2 解决方案2.1 递归法如果整个台阶只有1级,则显然只有一种跳法。如果台阶有2级,则有两种跳法:一种是分两次跳,每次跳1级;另一种是一次跳2级。推广到一般情况。则可以把n级台阶时的跳法看成是n的函数,记为f(n)。当n > 2时,第一次跳一级还是两级,决定了后面剩下的台阶的跳法数目的不同:如果第...原创 2019-07-21 21:43:17 · 13531 阅读 · 25 评论 -
Java实现最大连续子数组和
1 问题描述给定一个整数数组,数组里可能有正数、负数和零。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如,如果输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},那么输出为该子数组的和18。2 解决方案2.1 蛮力枚举法package com.liuzhen.array_2;public c...原创 2019-07-21 21:18:11 · 12583 阅读 · 41 评论 -
Java实现二进制幂
1 问题描述使用n的二进制表示,计算a的n次方。2 解决方案2.1 从左至右二进制幂此方法计算a的n次方具体思想,引用《算法设计与分析基础》第三版一段文字介绍:package com.liuzhen.chapter6;import java.util.ArrayList;import java.util.Scanner;public class LeftRightBinar...原创 2019-07-21 20:50:49 · 12157 阅读 · 14 评论 -
Java实现预排序
1 问题描述在计算机科学中,预排序是一种很古老的思想。实际上,对于排序算法的兴趣很大程度上是因为这样一个事实:如果列表是有序的,许多关于列表的问题更容易求解。显然,对于包含了排序操作,这种算法的时间效率依赖于所选用的排序算法的效率。对于预排序的具体思想应用请参考下文。2 解决方案2.1 检验数组中元素的唯一性此问题,首先使用合并排序对数组中元素进行一次从小到大的排序,然后,依次检查数组中...原创 2019-07-21 16:04:13 · 12027 阅读 · 23 评论 -
Java实现寻找最小的k个数
1 问题描述有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低。2 解决方案2.1 全部排序法先对这n个整数进行快速排序,在依次输出前k个数。package com.liuzhen.array_2;public class SearchMinK { //方法1:全部排序 public void quickSort(int[] A,int start,int e...原创 2019-07-21 16:02:08 · 12339 阅读 · 19 评论 -
Java实现大整数乘法
1 问题描述计算两个大整数相乘的结果。2 解决方案2.1 蛮力法package com.liuzhen.chapter5;import java.math.BigInteger;public class BigNumber { /* * 参数A:进行乘法运算的大整数A,用字符串形式表示 * 参数B:进行乘法运算的另一个大整数B,用字符串形式表示 ...原创 2019-07-21 15:56:38 · 12876 阅读 · 23 评论 -
Java实现蓝桥杯十六进制转八进制
基础练习 十六进制转八进制时间限制:1.0s 内存限制:512.0MB提交此题 锦囊1 锦囊2问题描述 给定n个十六进制正整数,输出它们对应的八进制数。输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式 输出n...原创 2019-06-06 20:54:50 · 17057 阅读 · 31 评论 -
Java实现约瑟夫斯问题
1 问题描述引用自《算法设计与分析基础》第三版:约瑟夫斯问题,是以弗拉瓦斯。约瑟夫斯(Flavius Josephus)的名字命名的。约瑟夫斯是一个著名的犹太历史学家,参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫斯作为一个将军,设法守住了裘达伯特的堡垒达47天之久,但在城市陷落了以后,他和40名顽强的将士在附近的一个洞穴中避难。在那里,这些反抗者表决说“要投降毋宁死”。于是,约瑟夫...原创 2019-07-21 15:09:03 · 11838 阅读 · 14 评论 -
Java实现字符串转换成整数
1 问题描述输入一个由数字组成的字符串,请把它转换成整数并输出。例如,输入字符串“123”,输出整数123。请写出一个函数实现该功能,不能使用库函数。2 解决方案解答本问题的基本思路:从左至右扫描字符串中的每个字符,把之前扫描得到的数字乘以10,再加上当前字符表示的数字。但是,基本思路是这样,还要注意以下几点:(1)最好判断一下输入是否为空。(2)如果字符串的第一个字符是‘-’号,最...原创 2019-07-21 14:52:11 · 21621 阅读 · 19 评论 -
Java实现俄式乘法
1 问题描述首先,了解一下何为俄式乘法?此处,借用《算法设计与分析基础》第三版上一段文字介绍:2 解决方案package com.liuzhen.chapter4;public class RussianPeasant { //方法1:递归求解 public void recursionRussian(int m,int n,int result){ i...原创 2019-07-21 14:48:02 · 12448 阅读 · 24 评论 -
Java实现二分查找(折半查找)
1 问题描述首先,了解一下何为折半查找?此处,借用《算法设计与分析基础》第三版上一段文字介绍:2 解决方案2.1 递归法package com.liuzhen.chapter4;public class BinarySearch { //方法1:递归求解 public void recursionSearch(int[] A,int start,int end,int...原创 2019-07-21 14:44:18 · 12109 阅读 · 18 评论 -
Java实现字符串的全排列
1 问题描述输入一个字符串,打印出该字符串的所有排列。例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所能排列出来的所有字符串”abc”,”acb”,”bac”,”bca”,”cab”,”cba”。2 解决方案2.1 递归实现从字符串中选出一个字符作为排列的第一个字符,然后对剩余的字符进行全排列。如此递归处理,从而得到所有字符的全排列。package com.liuzhen...原创 2019-07-21 14:41:04 · 17612 阅读 · 27 评论 -
Java实现字符串的包含
1 问题描述给定一长字符串A和一短字符串B。请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A中?请编写一个判断函数实现此功能。为简单起见,假设输入的字符串只包含小写英文字母。下面举几个例子。(1)如果字符串A是”abcd”,字符串B是”bad”,答案是包含,因为字符串B中的字母都在字符串A中,或者说B是A的真子集。(2)如果字符串A是”abcd”,字符串B是”bce”,答案是...原创 2019-07-21 14:36:34 · 15960 阅读 · 26 评论 -
Java实现凸包问题
1 问题描述给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点。另外,形象生动的描述:(1)我们可以把这个问题看作如何用长度最短的栅栏把n头熟睡的老虎围起来。(2)也可以这样看:请把所讨论的点想象成钉在胶合板上的钉子,胶合板代表平面。撑开一根橡皮筋圈,把所有的钉子都围住,然后啪一声松开手。凸包就是以橡皮圈为边界的区域。具体示意如下图1所示:2 ...原创 2019-07-20 21:51:27 · 12721 阅读 · 7 评论 -
Java实现选择排序和冒泡排序
1 问题描述给定一个可排序的n元素序列(例如,数字、字符和字符串),将它们按照非降序方式重新排列。2 解决方案2.1 选择排序原理简介选择排序开始的时候,我们从第一个元素开始扫描整个列表,找到它的最小元素,然后和第一个元素交换,将最小元素和第一个元素交换位置;然后,我们从第二个元素开始扫描剩下的n-1个元素,找到这n-1个元素中的最小元素,将最小元素和第二个元素交换位置;然后从第三个元素开...原创 2019-07-20 21:23:47 · 12110 阅读 · 26 评论 -
Java实现堆排序问题(变治法)
问题描述用基于变治法的堆排序算法对任意一组给定的数据进行排序2.1 堆排序原理简介堆可以定义为一颗二叉树,树的节点中包含键(每个节点是一个键),并且满足下面两个条件:(1)树的形状要求——这颗二叉树是基本完备的(或者简称为完成二叉树),这意味着,树的每一层都是满的,除了最后一层最右边的元素有可能缺位。(2)父母优势要求,又称为堆特性——每一个节点的键都要大于或等于它子女的键(对于任何孩...原创 2019-07-20 21:00:04 · 11945 阅读 · 30 评论 -
Java实现背包问题
1 问题描述给定n个重量为w1,w2,w3,…,wn,价值为v1,v2,…,vn的物品和一个承重为W的背包,求这些物品中最有价值的子集(PS:每一个物品要么选一次,要么不选),并且要能够装到背包。附形象描述:就像一个小偷打算把最有价值的赃物装入他的背包一样,但如果大家不喜欢扮演小偷的角色,也可以想象为一架运输机打算把最有价值的物品运输到外地,同时这些物品的重量不能超出它的运输能力。2 解决方...原创 2019-07-20 22:08:32 · 13796 阅读 · 21 评论 -
Java实现BFS广度优先查找
1 问题描述广度优先查找(Breadth-first Search,BFS)按照一种同心圆的方式,首先访问所有和初始顶点邻接的顶点,然后是离它两条边的所有未访问顶点,以此类推,直到所有与初始顶点同在一个连通分量中的顶点都被访问过了为止。如果仍然存在未被访问的顶点,该算法必须从图的其他连接分量中的任意顶点重新开始。2 解决方案2.1 蛮力法此处借用《算法设计与分析基础》(第3版)上一段文字介...原创 2019-07-20 22:12:41 · 11863 阅读 · 18 评论 -
Java实现DFS深度优先查找
1 问题描述深度优先查找(depth-first search,DFS)可以从任意顶点开始访问图的顶点,然后把该顶点标记为已访问。在每次迭代的时候,该算法紧接着处理与当前顶点邻接的未访问顶点。这个过程一直持续,直到遇到一个终点——该顶点的所有邻接顶点都已被访问过。在该终点上,该算法沿着来路后退一条边,并试着继续从那里访问未访问的顶点。再后退到起始顶点上,并且起始顶点也是一个终点时,该算法最终停了...原创 2019-07-20 22:10:25 · 11943 阅读 · 23 评论 -
递归执行顺序的探究
1 问题描述最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排序的序列问题,即共有n!次不同排序)。为此,我认真看了一篇出自优快云上的博客文章,其中有一段核心代码就是在for循环里面添加一句递归调用语句,来实现n!次排序。因此,我对文章中的那段核心代码苦苦不得其解——其执行顺序究竟是咋样的呢?附其简要代码:public int count = ...原创 2019-07-20 21:55:59 · 14779 阅读 · 18 评论