算法很美课程学习
文章平均质量分 62
包含课程中各种例题的解法和总结
逍遥自在”
这个作者很懒,什么都没留下…
展开
-
POJ1287 (最小生成树) 中文版
问题描述: 您被分配在广域内的某些点之间设计网络连接。在该区域中为您提供了一组点,以及可能连接成对点的电缆的一组可能路线。对于两点之间的每条可能路线,将为您提供在该路线上连接各点所需的电缆长度。请注意,两个给定点之间可能存在许多可能的路线。假定给定的可能路线(直接或间接)连接区域中的每两个点。 您的任务是设计该区域的网络,以使每两个点之间都具有连接(直接或间接)(即,所有点都是互连的,但不一定是通过直接电缆),并且总长度为使用的电缆极少。输入量: 输入文件由许多数据集组成。每个数据集定义一个所原创 2020-06-15 12:20:14 · 910 阅读 · 0 评论 -
贪心和动态规划总结
贪心法:最优子结构:对比,不是进行各种可选支路的试探,而是当下就可用每种策略确定选择,无需考虑未来(未来情况的演变也影响不了当下的选择)。只要一直这么选下去,就能得出最终的解,每一步都是当下(子问题)的最优解,结果是原问题的最优解,这叫最优子结构。更书面的说法是:如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构。贪心与DFS:具备这类结构的问题,可以用局部最优解来推导全...原创 2020-03-19 11:26:00 · 5500 阅读 · 0 评论 -
最长递增子序列
问题描述:给定一串数字,输出这串数字中最长递增子序列的长度。例如:输入:4 2 3 1 5输出:3(因为2 3 5组成了最长子序列)解法一: 暴力法,两层循环,依次遍历。代码如下:import java.util.*;public class 最长递增子序列 { public static void main(String[] args){ int[] arr = ...原创 2020-03-19 10:13:12 · 947 阅读 · 0 评论 -
动态规划解决完全背包问题
问题描述: 给定N个物品,并且给出他们的价值和重量。给一个承重最多为WW袋子,问用这个袋子装物品,能得到的最大价值是多少?解题思路: 这个和01背包问题最大的区别在于每一种物品可以选择多个。建立dp表,行表示当前最大容量,列表示当前的可选范围。每一个单元格表示在当前最大容量以及可选范围内可以得到的最大价值。我们可以首先对第一行和第一列进行初始化,第一列也就是最大容量是0时能获得的...原创 2020-03-18 13:16:55 · 1334 阅读 · 0 评论 -
求最大公共子序列问题
问题描述:给定两个字符串s1和s2;输出它们的最大公共子序列。子序列和子数组不同,子数组是连续的;而子序列不要求是连续的,只要前后顺序关系一致就行。例如:输入:AB34CA1BC2输出:ABC输入:3563243513141输出:534解法一:用递归的解法,遍历其中一个字符串,对其中的每一个字母在另一个字符串中找相同。找到后把剩余的字符串进行下一轮的递归。即在双层循环...原创 2020-03-17 14:53:31 · 1256 阅读 · 0 评论 -
数字三角形求最大路径和的多种解法
问题描述: 在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或者右下走,只需要求出这个最大和即可,不需要给出具体路径。例如:7 3 88 1 02 7 4 44 5 2 6 5解法一: 递归。每一个点都有两个方向选择,所以递归树是二叉树。代码如下:import java.util.Scanner;public cl...原创 2020-03-15 13:57:42 · 2939 阅读 · 0 评论 -
算法导论中的钢条切割问题
问题描述: 公司购买长钢条,将其切割为短钢条进行出售,切割工序本身没有成本支出,公式管理层希望知道最佳的切割方案。假定我们知道公司出售一段长为i英寸的钢条价格为pi;钢条的长度均为整英寸。给定一段长度为n英寸的钢条和一个价格表pi,求切割钢条方案,使得销售收益最大。如果长度为n英寸的钢条的价格足够大,最优解可能就是完全不用切割。长度:1, 2, 3, 4, 5, 6, 7, 8, 9,10...原创 2020-03-15 11:22:04 · 1262 阅读 · 0 评论 -
01背包问题的多种解法
问题描述:有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中价值总和的最大值。对于每一个物品都只有选和不选的两种选择;所以称为01背包问题。解题思路: 首先声明记忆型递归(也叫记录型递归)的特点,记忆型递归主要用于求解子问题有重叠现象的递归;是为了避免将一个子问题多次求解;所以在求解子问题是将子问题的解记录下来,到再一次碰到相同的子问题时不需要再...原创 2020-03-13 11:22:41 · 4176 阅读 · 1 评论 -
贪心法解决最小字典序问题
问题描述:给定一个长度为n的字符串S,构造一个字符串T,长度也为n;起初,T是一个空字符串,随后反复进行以下操作:1、从S的头部删除一个字符,加到T的尾部。2、从S的尾部删除一个字符;加到T的尾部。目标是:最后生成的字符串T的字典序尽可能小。解题思路:每次选取的时候将头尾两个字符对比,将字典序小的删除并添加到T中。我们可以将S给逆序,保存为另一个字符串。然后将逆序的S和正序的S首字符的...原创 2020-03-12 13:45:39 · 1927 阅读 · 0 评论 -
贪心法解决区间调度(不相交区间和区间选点)问题
问题描述:有n项工作,每项工作分别在si时间开始,ti时间结束。对于每项工作,你都可以选择是否参与,如果选择了参与,那么自始至终都必须全程参与。此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的)。你的目标是参与尽可能多的工作,那么最多能参与多少项工作?输入:第一行:n第二行:n个整数空格隔开,代表n个工作的开始时间第三行:n个整数空格隔开,代表n个工作的结束...原创 2020-03-09 12:11:55 · 1171 阅读 · 0 评论 -
运用分治思想的排序(快速排序和归并排序)
分治思想是常见的算法思想之一,在排序算法中用到分治思想的有:快速排序和归并排序。分治法介绍如下图:分治思想的关键点:1、有问题可以一直分解为形式相同的子问题,当子问题规模较小时,可自然求解,例如一个元素本身有序。2、子问题的姐通过合并可以得到有问题的解。3、子问题的分解以及解的合并一定是比较简单的,否则分解和合并所花的时间可能超出暴力解法,得不偿失。一、快速排序1、一遍单向扫描法...原创 2020-01-23 22:29:21 · 4734 阅读 · 0 评论 -
多维数组和矩阵的基础题型
本文主要介绍关于多维数组和矩阵的题型,从基础开始逐步深入。一、顺时针打印矩阵如下图:解题方法:把矩阵分解为多个矩形框,从最外层开始打印,每次循环打印一个矩形框,一个循环里用四个while循环打印,每个while循环打印一个矩形的一条边。(用矩阵框的两个顶点进行循环的控制,当左上角的行号小于右下角的行号就退出外层循环)代码如下:public class 顺时针打印矩阵 { public...原创 2020-01-29 12:10:13 · 1198 阅读 · 0 评论 -
Nim游戏
Nim游戏:一共有N堆石子,编号从1到N,第i堆中有a[i]个石子。有A和B两个人。依次拿石子,每次可以从任意堆中拿任意数量的石子,至少拿一颗。至多拿着一堆剩下的所有石子。两个人轮流行动;取光所有石子的一方获胜(最后一次拿石子的那一人获胜)。假定A先手,且两人都会常用最优策略,A会不会获胜?解题思路:题目问的是会不会有一方稳赢的情况和策略。这是一个数学问题,有一个结论:就是将这N个数(剩余的数...原创 2020-02-08 12:03:44 · 1578 阅读 · 2 评论 -
全排列的多种写法
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。以下的解法都以字符串的全排列为列。生成树解法:以数字1,2,3为例,可以采用树的结构表示全排列生成算法,以数字的全排列生成算法为例,从最小的数1开始,其全排列只有一种可能;加入数字2,数字2可以插入在1的后边或前边,有两个不同位置;再加入3,对于第二层...原创 2020-02-25 13:25:08 · 2913 阅读 · 0 评论 -
数独游戏问题
问题描述:九宫格是在81个格子(9×9)中,要满足以下条件:(1)每个横行和竖列中的9个格子都包含数字1~9,且不重复;(2)每个颜色相同的9个格子(3×3)都包含数字1~9,且不重复。如图所示:(3)保证输入的数据是合法的,而且题目有唯一的解。要求:找出给定数字的九宫格。输入形式:输入9行9列81个数字,其中0表示要填的数字。输出形式:输出满足条件的九宫格。某测试样例如下:输...原创 2020-02-26 12:40:10 · 3660 阅读 · 0 评论 -
部分和问题(挑战程序设计竞赛)
问题描述:给定一个整数K和一个整数数列a1,a2,…,an,判断是否可以从中选出若干个数,使得它们的和恰好为K。样例:输入:n=4a={1,2,4,7}K=13输出:Yes(13 = 2 + 4 + 7)解法一: 这题可以套用生成子集的模板,求出这个整数数列的所有子集,去判断每一个子集是否满足条件。我们可以利用二进制求解,将数组中的n个元素对应n位的二进制。其中每一个元...原创 2020-02-27 15:48:09 · 1060 阅读 · 0 评论 -
素数环问题(算法竞赛入门经典)
问题描述:输入一个正整数,对1~n进行排列,使得相邻的两个数之和均为素数;头尾相加也要为素数。输出时从整数1开始,逆时针排序。同一个输出一次。例如输入:6输出:1 4 3 2 5 61 6 5 2 3 4解法一:用DFS求解,逐步试探。代码如下:import java.util.*;public class 素数环 { public static void main(Str...原创 2020-02-29 10:45:01 · 1982 阅读 · 0 评论 -
用深搜解决n皇后问题
问题描述:在一个n*n的棋盘上放置n个棋子,使得每行每列和对角线上都只有一个棋子,求有多少种摆放方法。例如n=4;其中一种情况如下:解题思路: 这是典型的递归问题,用DFS可以解决,由于每一行只能放一个,所以不需要一个格子一个格子去试探,可以一行一行去试探;用一个一维数组来表示棋盘的情况,数组下标表示行,数组元素的值表示在对应的行的那一列放棋子。每一行一共有n种(n列)放法,每一种放法...原创 2020-02-28 12:06:26 · 1055 阅读 · 0 评论 -
位运算的奇巧淫技
下面主要介绍利用二进制的位运算解决问题,二进制和其他进制之间的一些以及二进制间的一些规律和技巧运用。下面提到的算法和技巧参考书籍如下:《程序员面试金典》《挑战程序设计竞赛》《程序员代码面试指南》《剑指offer》《编程之美》《算法导论》一、二进制中1的个数问题如下:输入一个整数,输出该数二进制表示中1的个数例如:9的二进制是1001, 有两个1。解法一:最简单的方法是用一个1进行不断的...原创 2020-01-19 13:52:54 · 1204 阅读 · 0 评论 -
递归,DFS,回溯的总结
逐步生成类型的递归题型: 逐步生成类型的题,一般都是求n的解,然后n的解可以通过(n-1 )的解推出,(n-1)的解又可以通过(n-2)的解推出,以此类推直到找到一个现在已知的解(一般是n=1时),就可以推出n的解。整个过程有点类似于数学归纳法。机器人走方格硬币凑数问题括号组合问题生成所有子集全排列的多种写法(可以用逐步生成的方式也可以用DFS)DFS类型的递归题型:DF...原创 2020-03-01 12:44:43 · 1057 阅读 · 0 评论 -
递归的基础运用和讲解
递归设计的规律:1、找重复(子问题)2、找重复中的变化量(参数)3、找参数变化趋势,设计出口,即找边界。一般放在函数的开始(条件判断)。以下问题只是为了递归练习,有些问题可能用循环解决更方便。简单递归问题的实现:一、用递归求阶乘找重复:求n的阶乘就是求n*(n-1)! ,(n-1)的阶乘就是问题的重复(子问题)找变化:变化量就是不断减小的n, 应该作为参数。找边界:每一个递归都得...原创 2020-01-20 16:02:14 · 1096 阅读 · 0 评论 -
用递归实现全排列和组合
递归实现全排列和组合下面用C语言实现,并不是真正可运行的代码,只是用函数的方式体现算法的思想。全排列:算法思想:分治思想,比如进行五个数的排列,相当于选出一个数与剩下四个数排列的结果组合,而四个数的排列就是选出一个数,然后与剩下的三个数的排列结果进行组合。以此类推代码如下:perm(int a[], int p, int q)//求p到q的全排列 { if(p==q) //递...原创 2019-12-14 16:32:16 · 1070 阅读 · 0 评论 -
字符串匹配 KMP算法
问题描述:字符串匹配即查找待匹配字符串(模式串)p在主串s中的位置。一般处理这种问题往往采用简单粗暴的方法——暴力匹配法。所谓暴力匹配法,就是对主串s的每一个字符与要匹配的字符串p的每个字符进行逐一匹配。但暴力匹配效率比较低,经典算法KMP效率更高。例:主串s=“abcdeabcdxabc”,模式串p=“abcdx”。结果应该返回5。暴力匹配的图解如下:代码如下:public clas...原创 2020-02-06 13:30:14 · 1013 阅读 · 0 评论 -
Java 旋转词 判断一个字符串循环移位后是否包含另外一个字符串
问题描述:这是《编程之美》里的一个问题。解题方法:旋转词是指字符串A可以通过字符串B循环移位的得到就称A是B的旋转词;判断A是否是B的旋转词有一个规律:将字符串A与自身链接起来也就是将两个A链接起来。如果连个A链接起来的结果包含B,则A是B的旋转词。旋转词是相互的,A是B的旋转词,那么B肯定也是A的旋转词,所以用两个B链接起来判断是否包含于A也是可以的。互为旋转词的两个字符串长度肯定是相等的。...原创 2020-02-01 11:43:01 · 1172 阅读 · 0 评论 -
Java 变形词:一个字符串重新排序能否变为另外一个字符串
问题描述:给定量分字符串,其中一个重新排序后能否边为另外一个字符串。规定区分大小写并且考虑空格。解题思路:先判断两个字符串的长度是否相等,不相等肯定不满足。如果相等则将两个字符串转换为字符数组,分别进行排序,将两个排序后的字符数组进行比较,如果相等就代表其中一个可以通过一定的位置交换成为另外一个字符串。代码如下:import java.util.Arrays;public class 变...原创 2020-01-30 11:38:15 · 1190 阅读 · 0 评论 -
Java字符串,int型,char型之间的相加运算
Java字符串,int型,char型之间的相加运算字符串和int型之间相加,int型会转换为字符串类型;例如:System.out.println("asd" + 2);输出结果得到:asd2;char型和int型之间相加,char型会转换为int类型;例如:System.out.println('a' + 1);输出结果得到:97char temp1 = '1';char...原创 2019-08-21 10:56:42 · 17315 阅读 · 1 评论 -
Java 生成所有子集
问题描述:给定一个数组A和数组的大小n,返回A的所有子集。保证A的元素互异。解法1:可以将问题分解,先求出只有1个元素的子集,然后求只有两个元素的子集,一直求到n;然后进行统计时加上空集。这样就把问题分解成n个组合问题。但这样效率比较低。这里省略不讲。解法2:采用逐步生成的办法,先假设只求一个元素的所有子集,容易得出结果为空集和元素本身。然后再这个基础上去求2个元素的所有子集;由于现在多了一个...原创 2020-02-23 11:14:29 · 1453 阅读 · 0 评论 -
Leetcode第22题 Java 括号组合问题
问题描述:打印n对括号的全部有效组合。例如输入:3输出:((())),()()(),(())(),()(()),(()())解题思路:可以用递推法,当n等于1时只有一种组合,当n等于2时有四种组合。慢慢类推可以发现:n=k的组合方式等于n=k-1的组合方式中每一个元素分别在左边,右边添加一个括号以及把原来的方式给括起来。也就是说当n+1时,原组合方式中的每一种形式都可以推出三种形式。...原创 2020-02-14 13:25:55 · 1211 阅读 · 3 评论 -
Java 硬币凑数问题
问题描述:硬币分别有面值分别为1,5, 10, 25四种面值。输入一个整数n,用这些硬币组合成数值n,问有多少种组合方式?解法一:暴力破解,用四个for循环破解。代码如下:import java.util.Scanner;public class 硬币凑数问题 { public static void main(String[] args){ Scanner scanner =...原创 2020-02-13 12:46:23 · 2761 阅读 · 1 评论 -
Java 机器人走方格
问题描述:有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。解题思路:这题有两个解题方法;可以用深度搜索的方法,但是比较麻烦,这里就不说了。还有一种方法是用递推的方法,假设x和y等于1时有多少种走法,然后逐渐增大z和y然后慢慢递推找规律...原创 2020-02-12 21:19:46 · 1494 阅读 · 0 评论 -
Java 天平称重
题目: 天平称重用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。如果只有5个砝码,重量分别是1,3,9,27,81则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。本题目要求编程实现:对用户给定的重量,给出砝码组合方案。例如:用户输入:5程序输出:9-3-1用户输入:19程序输出:27-9+1解题思路:可以用进制解决,...原创 2020-02-08 11:12:42 · 1598 阅读 · 0 评论 -
Java 字符串专题讲解(整合)
1、判断字符串有无重复字符2、翻转字符串 将字符串逆序3、变形词:一个字符串重新排序能否变为另外一个字符串4、替换字符串的空格5、压缩字符串6、判断两个字符串的字符集是否相同7、判断一个字符串循环位移后是否包含另外一个字符串8.将字符串按单词翻转9、去掉字符串中连续出现K次的010、回文串的判定11、生成最短摘要 尺取法12、字符串匹配 KMP算法13、hiho字符串 ...原创 2020-02-07 11:22:39 · 5150 阅读 · 0 评论 -
Java hihocode hiho字符串(尺取法的应用)
时间限制:10000ms单点时限:1000ms内存限制:256MB描述如果一个字符串恰好包含2个’h’、1个’i’和1个’o’,我们就称这个字符串是hiho字符串。例如"oihateher"、"hugeinputhugeoutput"都是hiho字符串。现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。输入字符串S对于80%的数据,S的...原创 2020-02-07 10:46:29 · 1080 阅读 · 0 评论 -
Java 生成最短摘要 尺取法
最短摘要,这是《编程之美》里的一个问题:简单点说就是你在搜索引擎上输入关键字,然后后找出包含你输入的所有关键字最短的一段话(或者说是一串字符串)。下面是阿里巴巴2011年的一个笔试题,也是关于最短摘要的问题。给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(Stri...原创 2020-02-04 12:24:41 · 1367 阅读 · 1 评论 -
Java 回文串判定
回文串是指从左到右读和从右到左读是一样的。也就是说字符串和它翻转后的结果是相同的。代码如下:public class 回文串判定 { public static void main(String[] args){ String str = "abcba"; System.out.println(f(str)); } private static boolean f(Strin...原创 2020-02-02 12:09:35 · 1381 阅读 · 0 评论 -
Java 去掉字符串中连续出现K次的0
问题描述:给定一个字符串,去掉字符串中连续出现k次的0;例如:100001 K=3;得到101。解一:如果K是常量,这题就非常简单,相当于删除字符串中指定的子串。可以用子串为参照进行切割。然后再将分割后的字符串进行链接起来。下面以删除子串“000”为例。代码如下:public class 去掉连续K次出现的0 { public static void main(String[] a...原创 2020-02-02 11:36:04 · 1394 阅读 · 0 评论 -
剑指offer第58题 将字符串按单词翻转
问题描述:将字符串按单词翻转,例如here you are 翻转成are you here解题方法:先将整个字符串进行翻转,然后将字符串按空格进行切割成字符串数组,再将每一个字符串进行翻转,然后依次链接起来。代码如下:public class 按单词翻转 { public static void main(String[] args){ String str = "here you...原创 2020-02-02 10:38:53 · 1107 阅读 · 0 评论 -
java 判断两个字符串的字符集是否相同
问题描述:给定两个字符串判断它们的字符集是否相同。例如:“aaabbcc”和“abc”的字符集是相同的,字符集都是{a,b,c}。解题方法:这题与变形词不同在于仅仅要求字符集相同,对数量和长度没有要求。而变形词是要求重复出现的次数也要相同。可以Java提供的hashSet进行统计。hashSet可以过滤重复的元素,先将第一个字符串的元素依次添加到hashSet中。记录此时hashSet的大小,...原创 2020-01-31 11:59:23 · 2014 阅读 · 1 评论 -
Java 压缩字符串
问题描述:给定一个字符串,利用字符重复出现的次数压缩字符串(重复的字符只会连续的出现)。例如:aabcccccaaa压缩后的字符串为:a2b1c5a3。解题方法:扫描字符串并统计重复字符出现的次数,当遇到新的字符时将上一个字符添加并且添加数字。代码如下:public class 压缩字符串 { public static void main(String[] args){ Strin...原创 2020-01-31 11:00:19 · 1356 阅读 · 0 评论 -
剑指offer第五题 替换空格
问题描述:给定一个字符串,将字符串中的空格替换为“%20”。解一:利用JavaAPI中String类的replaceAll()实现。代码如下:public class 替换字符串中的空格 { public static void main(String[] args){ String str = "no consoles to display"; System.out.printl...原创 2020-01-31 10:29:07 · 931 阅读 · 0 评论