
算法
普通网友
这个作者很懒,什么都没留下…
展开
-
谷歌面试题之扔鸡蛋的问题(蓝桥杯摔手机的问题)
来自一个古老的公众号(摔手机就是根据扔鸡蛋过来的)吐个槽先正如昨天所说,这道题据说它最早见于谷歌的某次面试,由于题目表述容易,而解答相对麻烦,于是被很多人采用,广泛见于一些算法、规划的面试里。要说清楚这个问题有点难度,有兴趣的小伙伴务必要静下心来仔细看。首先我想说,该问题的情境构造是有缺陷的。因为在现实中,影响鸡蛋是否会破裂的最重要因素应该是地面的坚硬和平整程度,而不是鸡蛋下落的高度:把...原创 2020-02-04 21:23:27 · 15350 阅读 · 34 评论 -
Java实现最大流量问题
1 问题描述何为最大流量问题?给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点n能够接收的最大流量。图中每条边的权值为该边的容量,从顶点0到顶点n的某一条路径中最大流量不能超过该路径中任何一条边剩下的容量。2 解决方案上述对于最大流量问题的描述是楼主自己个人描述,描述的有点粗暴简略>~<。求取最大...原创 2019-07-26 17:26:55 · 12543 阅读 · 24 评论 -
Java实现行列递增矩阵的查找
1 问题描述在一个m行n列的二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。现在输入这样的一个二维数组和一个整数,请完成一个函数,判断数组中是否含有该整数。2 解决方案2.1定位法下面算法的时间复杂度为O(m + n),空间复杂度为O(1)。package com.liuzhen.practice;public class Main { ...原创 2019-07-26 17:24:09 · 11875 阅读 · 23 评论 -
Java实现计数排序
1 问题描述给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列。2 解决方案2.1比较计数排序下面算法的时间复杂度为O(n^2),空间复杂度为O(n)。此方法对于任意一组数据均可排序。package com.liuzhen.practice;public class Main { public void comparisonCountingSort(int...原创 2019-07-26 17:22:05 · 12151 阅读 · 16 评论 -
Java实现完美洗牌算法
1 问题描述有一个长度为2n的数组{a1,a2,a3,…,an,b1,b2,b3,…,bn},希望排序后变成{a1,b1,a2,b2,a3,b3,…,an,bn},请考虑有没有时间复杂度为O(n)而空间复杂度为O(1)的解法。2 解决方案2.1位置置换算法下面算法的时间复杂度为O(n),空间复杂度为O(n)。package com.liuzhen.practice;public cl...原创 2019-07-26 17:20:14 · 12863 阅读 · 28 评论 -
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和sum,要求从数列1,2,3,…,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来。2 解决方案上述问题是典型的背包问题的应用,即先找出n个数的所有组合,再在这些组合中寻找组合数相加之和等于sum的组合,并依次输出这些组合中的数。package com.liuzhen.array_2;public class ManySumN { ...原创 2019-07-21 20:52:20 · 12948 阅读 · 24 评论 -
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 问题描述输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数。如果有多对数的和等于输入的整数,输出任意一对即可。例如,如果输入数组[1,2,4,5,7,11,15]和整数15,那么由于4+11 = 15,因此输出4和11。2 解决方案2.1 排序夹逼法首先将整数数组,使用合并排序进行从小打到的排序,然后对这个排完序的数组从两头往中间遍历,一旦出现两个数的和等...原创 2019-07-21 17:50:40 · 12003 阅读 · 17 评论 -
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 问题描述给定一个浮点数组,任意取出数组中的若干个连续的数相乘,请找出其中乘积最大的子数组。2 解决方案2.1 蛮力法该方法的时间复杂度为O(n^2)。package com.liuzhen.practice;public class Main { public void getResult(double[] A) { double max = 1...原创 2019-07-26 17:29:25 · 12657 阅读 · 18 评论 -
Java实现字符串编辑距离
1 问题描述给定一个源串和目标串,能够进行如下操作:在任意位置上插入一个字符;替换掉任意字符;删除任意字符。写一个程序,实现返回最小操作次数,使得对源串进行上述这些操作后等于目标串。2 解决方案此处采用动态规划法,可以较大的提高时间效率。package com.liuzhen.practice;public class Main { public void g...原创 2019-07-26 17:33:51 · 12416 阅读 · 22 评论 -
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实现有向图强连通分量的Tarjan算法
1 问题描述引用自百度百科:如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个...原创 2019-07-26 18:01:13 · 12266 阅读 · 26 评论 -
Java实现最小费用最大流问题
1 问题描述在最大流有多组解时,给每条边在附上一个单位费用的量,问在满足最大流时的最小费用是多少?2 解决方案下面代码所使用的测试数据如下图:package com.liuzhen.practice;import java.util.ArrayList;import java.util.Scanner;public class Main { public static ...原创 2019-07-26 17:48:33 · 12654 阅读 · 21 评论 -
Java实现稳定婚姻问题
1 问题描述何为稳定婚姻问题?有一个男士的集合Y = {m1,m2,m3…,mn}和一个女士的计划X = {n1,n2,n3,…,nn}。每一个男士有一个排序的列表,把女士按照潜在的优先级进行排序。同样,每一个女士也有一个男士的优先级列表。现在,把男士和女士进行配对,要求尽可能的符合优先级的要求。使得最终的配对结果,男士对女士都可接受,不会出现拒绝的情况,即每对男士和女士都是稳定的。2 解决...原创 2019-07-26 17:44:49 · 12232 阅读 · 29 评论 -
Java实现二分图的最大匹配
1 问题描述何为二分图的最大匹配问题?引用自百度百科:首先得说明一下何为匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。极大匹配(Maximal Matching)是指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数。最大匹配(maximum matching)是所有极大匹配当中边数最大的一个匹配。选...原创 2019-07-26 17:40:48 · 12689 阅读 · 20 评论 -
Java实现格子取数问题
1 问题描述有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右走,一共走两次(即从左上角往右下角走两趟),把所有经过的格子里的数加起来,求总和的最大值。如果两次经过同一个格子,则最后求得的总和中该格子中的数只加一次。2 解决方案此处采用动态规划法,可以较大的提高时间效率。package com.liuzhen.practice;import java.uti...原创 2019-07-26 17:35:33 · 11926 阅读 · 24 评论 -
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 问题描述给定一个字符串,求它的最长回文子串的长度。2 解决方案2.1 中心扩展法此处,首先枚举出回文串的中心位置,然后,再在该位置上分别向左和向右扩展,记录并更新得到的最长回文串的长度。package com.liuzhen.string_1;import java.util.Scanner;public class StringLongestPalindrome { ...原创 2019-07-21 15:54:04 · 12638 阅读 · 16 评论 -
Java实现选择问题
选择问题是求一个n个数列表的第k个最小元素的问题。那么如何寻找n个元素中第k个最小元素呢?package com.liuzhen.chapter4;public class SelectProblem { //快速选择 /* * 参数A:给定随机数数组 * 参数k:要求输出的第k个最小元素 * 函数功能:返回数组A的第k个最小元素的值 ...原创 2019-07-21 15:38:01 · 12732 阅读 · 19 评论 -
Java实现合并排序
1 问题描述给定一组数据,使用合并排序得到这组数据的非降序排列。2 解决方案2.1 合并排序原理简介引用自百度百科:合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序...原创 2019-07-20 21:46:24 · 12519 阅读 · 23 评论 -
Java实现埃拉托色尼筛选法
1 问题描述Compute the Greatest Common Divisor of Two Integers using Sieve of Eratosthenes.翻译:使用埃拉托色尼筛选法计算两个整数的最大公约数。(PS:最大公约数也称最大公因数,指两个或多个整数共有约数中最大的一个)2 解决方案2.1 埃拉托色尼筛选法原理简介引用自百度百科:埃拉托色尼筛选法(the Sie...原创 2019-07-20 21:43:16 · 12311 阅读 · 20 评论 -
Java实现希尔排序
1 问题描述给定一组数据,请使用希尔排序获取这组数据的非降序序列。2 解决方案2.1 希尔排序原理简介希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小,即增量大...原创 2019-07-20 21:39:34 · 11816 阅读 · 16 评论