自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 动态规划:最长递增子序列

题目描述给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n^2) 。d...

2022-03-21 20:07:46 525

原创 dfs、动态规划:数字三角形

题目描述在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。题目解析dfs思想;每次加上最大的一个dp思想dp[i]代表,每一行第i个位置最大加数,从最后一行开始,与递归方式相反代码 static int[][] ans; public static void main(String[] args) { Scanner scanner=new Scanner(System.in

2022-03-21 20:03:54 700

原创 贪心、动态规划:钢条切割

题目描述Serling公司购买长钢条,将其切割为短钢条出售。切割工序本身没有成本支出。公司管理层希望知道最佳的切割方案。假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元)。钢条的长度均为整英寸。钢条切割问题是这样的:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,…n),求切割钢条方案,使得销售收益rn最大。注意,如果长度为n英寸的钢条的价格pn足够大,最优解可能就是完全不需要切割。下面另n=10,给出个长度的价格,求价值最大值

2022-03-21 20:00:03 482

原创 算法很美:01背包问题(动态规划、贪心)

题目描述Sidney想去Gandtom家玩。但Sidney家和Gandtom家之间是高低不平、坑坑洼洼的土路。所以他需要用他的背包装几袋稀的泥,在路上铺平一些干的土,使路变成平整的泥土,才能到Gandtom家见到Gandtom。已知现在有n种稀的泥,第i种稀的泥的质量为wi,体积为vi。Sidney的包能装体积不超过V的稀的泥。Sidney出门时携带的稀的泥的质量应该尽可能的大。在此前提下,携带的稀的泥的体积也应该尽可能的大。试求Sidney最多能携带多少质量的稀的泥与此时的最大体积上路。Inpu

2022-03-21 19:55:34 1212

原创 贪心:部分背包问题

题目描述有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。求最大总价值注意:每个物体可以只拿一部分,因此一定可以让总重量恰好为C。尽可能能拿单价最高的,比如黄金,相同重量情况下价值最高,从大到小选 价值/重量高的,前面的物品全拿,最后一件根据重量拿部分代码public static void main(String[] args) { Scanner scanner=new Scanner(

2022-03-21 19:47:45 217

原创 贪心:构造字典序最小问题

题目描述给一个定长为N的字符串S,构造一个字符串T,长度也为N。起初,T是一个空串,随后反复进行下列任意操作:从S的头部删除一个字符,加到T的尾部从S的尾部删除一个字符,加到T的尾部目标是最后生成的字符串T的字典序尽可能小1≤N≤2000字符串S只包含大写英文字母输入:字符串S输出:字符串T题目解析将输入的字符串倒序,对倒序字符串和源串同时扫描,谁小保存谁,遇到相同的,则比较下一位,直到获取更小一位代码public static void main(String[] args

2022-03-21 19:45:50 315

原创 算法很美:区间调度问题及区间选点问题(贪心)

题目描述有n项工作,每项工作分别在si时间开始,在ti时间结束.对于每项工作,你都可以选择参与与否.如果选择了参与,那么自始至终都必须全程参与.此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的).你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?1≤n≤100000,1≤si≤ti≤109输入:第一行:n第二行:n个整数空格隔开,代表n个工作的开始时间第三行:n个整数空格隔开,代表n个工作的结束时间输出:常数(表示可参与的工作数)

2022-03-21 19:37:39 325

原创 算法很美:硬币支付(贪心)

题目描述有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?限制条件:0≤ C1,C5,C10,C50,C100,C500≤1000000000,0≤A≤1000000000输入描述:依次输入C1,C5,C10,C50,C100,C500和A,以空格分隔输出描述:输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY算法思想贪心:每次尽可能的多选择可使用的最大面值

2022-03-21 19:32:25 362

原创 算法很没:快速渡河问题

题目描述N个人希望只乘一条船过河,每条船最多只能载两个人。因此,必须安排谁去与回来,以便所有人最快过河。每个人都有不同的划船速度;两个人速度取决于较慢者。请给出时间最短的策略。输入值输入的第一行包含一个整数T(1 <= T <= 20),即测试用例的数量。然后是T例。每例的第一行N,第二行包含N个人过河的秒数。每个案例前面都有一个空白行。人数不超过1000,每人的时间不超过100秒输出量对于每个测试用例,打印一行N个人穿过河流所需的总秒数。解析由于渡河速度取决于两个

2022-03-10 15:09:24 683

原创 算法很美:硬币支付问题(贪心)

题目描述有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?限制条件0≤ C1,C5,C10,C50,C100,C500≤10000000000≤A≤1000000000输入描述:依次输入C1,C5,C10,C50,C100,C500和A,以空格分隔输出描述:输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY示例1输入3 2 1 3 0 2 620

2022-03-10 14:59:40 507

原创 算法很美:困难的串

题目描述如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串,如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困难的。输入正整数n,L,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串。例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABAn指定为4的话,输出ABAC代码 public static void ma

2022-03-10 14:49:41 210

原创 算法很美:素数环(dfs)

题目描述圆环由n个圆组成,如图所示。将自然数1、2,…,n分别放入每个圆,并且两个相邻圆中的数字总和应为质数。注意:第一个圆的数目应始终为1。输入值:n(0 <n <20)。输出量:输出格式如下所示。每一行代表环中从顺时针和逆时针1开始的一系列圆圈编号。数字顺序必须满足上述要求。按字典顺序打印解决方案。您将编写一个完成上述过程的程序。在每种情况下都打印空白行。代码public static void main(String[] args) { Scann

2022-03-10 14:48:02 282

原创 算法很美:n皇后问题

题目描述在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。解析采用”试探法”:即尝试每个位置是否能放,采用dfs思想,并根据要求即:(即任意2个皇后不允许处在同一排,同一列,

2022-03-10 14:44:13 115

原创 算法很美:水洼数(dfs)深搜

题目描述Descriptions:由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= 100; 1 <= M <= 100) 的正方形来表示。农场中的每个格子可以用’W’或者是’.'来分别代表积水或者土地,约翰想知道他的农场中有多少池塘。池塘的定义:一片相互连通的积水。任何一个正方形格子被认为和与它相邻的8个格子相连。给你约翰农场的航拍图,确定有多少池塘InputLine 1: N 和 MLines 2…N+1

2022-03-10 14:36:06 276

原创 算法很美:和为K的连续子数组

题目描述给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000]整数 k 的范围是 [-1e7, 1e7]。解析记录数组每个位置上的数,与之前所有数的和,扫描次数组若(两项的差额==K)则计数+1代码public static

2022-03-10 14:30:05 427

原创 算法很美:部分和问题

题目描述给定整数序列a1,a2,…,an,判断是否可以从中选出若干数,使它们的和恰好为k。解析采用深搜思想:每次抉择,选or不选当前元素,并以此穷举所有可能,并在穷举过程中,进行“剪枝”。代码public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n = scanner.nextInt(); int[] a=new int[n]; for (int i = 0;

2022-03-10 14:24:51 109

原创 算法很美:数独游戏

题目描述编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。PS:空白格用 ‘.’ 表示。代码public static void main(String[] args) { char[][] board = new char[][]{ {'5', '3', '.', '.', '7', '.', '

2022-03-10 14:19:41 3518

原创 算法很美:小孩上楼梯

题目描述有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。示例1:输入:n = 3输出:4说明: 有四种走法示例2:输入:n = 5输出:13提示:n范围在[1, 1000000]之间解析(递归解法)最优子问题:上一阶楼梯、上二阶楼梯、上三节楼梯,可以理解成,先上一阶楼梯+剩下的楼梯数对应的走法+先上二阶楼梯+剩下楼梯数对应的走法+先上三阶楼梯+剩余楼

2022-03-10 14:12:33 307

原创 代码很美:机器人走格子

题目描述有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。代码public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int x=scanner.nextInt(); int y=scanner.nextInt();

2022-03-04 21:33:38 109

原创 算法很美:合法括号

题目描述合法括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合分析对所有情况进行枚举,即在上一层结果的基础上,进行“左”、“右”、“包”代码 public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); Set<String> solve = solve(n); //Set<String&

2022-03-04 21:32:09 140

原创 算法很美:全排列&按字典序第k个全排列

全排列题目描述给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]代码public static void main(String[] args) { int[] a= {1,2,3,4,5}; ArrayList<ArrayList<Integer>> solve = solve(a); System.out.prin

2022-03-04 21:30:01 228

原创 算法很美:生成子集

题目描述打印出所给集合的所有子集代码 public static void main(String[] args) { int[] a= {1,2,3}; Set<Set<Integer>> sovle = sovle2(a); System.out.println(sovle); } //迭代方式 private static Set<Set<Integer>> so

2022-03-04 21:27:29 150

原创 算法很美:硬币表示某特定分数

题目描述硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1:输入: n = 5输出:2解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1示例2:输入: n = 10输出:4解释: 有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110=1+1+1+1+1+1+1+1+1+1分析从最大面值开选,选n个最大面值,最大面值大

2022-03-04 21:25:26 67

原创 算法很美:小孩上楼梯

题目描述三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。Codepublic static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); long solve = solve2(n); System.out.println(

2022-03-04 21:20:52 286

原创 算法很美:生理周期

题目描述人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一

2022-03-04 21:18:46 80

原创 算法很美:同余方程组

同余方程组解法逐级合并:x≡a1(modm1)x≡a2(modm2)x≡a3(modm3) 求x进行两两合并,得出两两合并后的通解,对于前两个方程组x=a1+k1m1x=a2+k2m2故消去x后得到 k1m1-k2m2=a2-a1 带入线性求解 可得到一个k1的特解即: x0=a1+k1m1则通解为 :x=x0+k[lcm(m1,m2)]; 即x≡x0[mod lcm(m1,m2)]更新此时的a=x0和m=lcm(m1,m2);并与下一组方程继续两两合并直到全部合并结束,

2022-03-04 21:13:33 305

原创 算法很美:模的逆元

题目描述要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。Input数据的第一行是一个T,表示有T组数据。每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。Output对应每组数据输出(A/B)%9973。解析(A/B)%9973=AxB关于9973的逆元%9973=nxB关于9973的逆元逆元:同余方程ax≡1 (mod n

2022-03-01 23:42:37 219

原创 算法很美:青蛙的约会

题目描述两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。我们把这两只青蛙分别叫做青蛙A和

2022-03-01 23:36:41 99

原创 算法很美:一步之遥、扩展欧几里得算法、裴蜀等式

题目描述从昏迷中醒来,小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃的轨道上。他的面前是两个按钮,分别写着“F”和“B”。小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。按F,会前进97米。按B会后退127米。透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。或许,通过多次操作F和B可以办到。矿车上的动力已经不太足,黄色的警示灯在默默闪烁…每次进行 F 或 B 操作都会消耗一定的能量。小明飞快地计算,至少要多少次操作

2022-03-01 23:34:18 97

原创 算法很美:Nim游戏

题目描述一共有N堆石子,编号1…n ,第i堆中有个a[门]个石子。每一次操作Alice和Bob可以从任意-堆石子中取出任意数量的石子至少取一颗,至多取出这一-堆剩下的所有石子。两个人轮流行动,取光所有石子的一方获胜。Alice为先手。给定a,假设两人都采用最优策略,谁会获胜?解析将每堆石子数进行^操作,最后结果为0则先手输,最后结果为1,则先手赢(个人也不是很明白为什么,就是懵懵懂懂很神奇)代码public static void main(String[] args) { int

2022-03-01 23:28:37 3527

原创 算法很美:天平称重

题目描述用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。如果有无限个砝码,重量分别是1,3,9,27,81,……等3的指数幂,神奇之处在于用它们可以称出任意整数重量(砝码允许放在左右两个盘中)。本题目要求编程实现:对用户给定的重量,给出砝码组合方案。用户输入:5程序输出:9-3-1用户输入:19程序输出:27-9+1要求程序输出的组合总是大数在前小数在后。可以假设用户的输入的数字符合范围1~121。算法思想采用二进制中一一对应的思想,eg:5的三进制为,1

2022-03-01 23:25:19 308

原创 kmp_search的java实现

public static void main(String[] args) { String s="bababb"; String patten="bab"; int[] next_s = next(s); System.out.println(Arrays.toString(next_s)); System.out.println(kmpSearch(s,patten)); }

2022-02-16 23:47:19 149

原创 算法很美:PaBinKarp字符串匹配之滚动hash

算法思想假设子串的长度为M,目标字符串的长度为N计算子串的hash值计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次)比较hash值如果hash值不同,字符串必然不匹配,如果hash值相同,还需要使用朴素算法再次判断算法关键在计算源串的hash值时若每次都调用hash()方法,则使时间复杂度达到O(mn)级别,与暴力扫描几乎一样,所以在计算源串hash时,可采用对上一组的hash值*seed-多余的部分。代码public static void main(St

2022-02-15 22:14:08 193

原创 算法很美:最短摘要

题目描述给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。解题思想尽量减少重复扫描的次数文中必定会多次出现包含关键字的多个片段,所以每次匹配的头起始位置和尾起始位置,是上一次匹配的头和尾代码public static void main(String[] args) { String description="z x

2022-02-15 22:08:08 144

原创 算法很美:回文串

题目描述“回文串”是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串。代码public static void main(String[] args) { String s="aba"; System.out.println(isPalindromeNum(s)); } private static boolean isPalindromeNum(String s) { r

2022-02-15 22:03:27 150

原创 算法很美:去掉字符串中连接出现K次的0

题目描述String s1=“asd00000dd”k=3输出asd000dd代码 public static void main(String[] args) { String s1="asd00000dd"; Scanner sc=new Scanner(System.in); int k=sc.nextInt(); System.out.println(deleteKZero(s1,k)); System.o

2022-02-15 22:01:53 158

原创 算法很美:两串的字符集相同

题目描述写一段代码,判断s1中的字符是否在s2中全部出现代码public static void main(String[] args) { String s1="asbafjkvasddaklwfw"; String s2="awdv"; boolean b1 = hasSameCharacters(s1, s2); boolean b2 = hasSameCharacters2(s1, s2); System.ou

2022-02-15 22:00:13 252

原创 算法很美:压缩字符串

题目描述字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。示例1:输入:“aabcccccaaa”输出:“a2b1c5a3”示例2:输入:“abbccd”输出:“abbccd”解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。提示:字符串长度在[0, 50000]范围内。

2022-02-15 21:55:09 98

原创 算法很美:替换字符串中的空格

题目描述请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串, 返回替换后的string。测试样例:"Mr John Smith”返回:“Mr%20John%20Smith””Hello World”返回:”Hello%20%20World”代码public static void main(String[] a

2022-02-15 21:53:08 50

原创 算法很美:变形词

题目描述变形词:两个串有相同的字符及数量组成 abc abc ,abc cba,aabcd bcada;给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false说明:你可以假设字符串只包含小写字母代码public static void main(String[] args) {

2022-02-15 21:50:01 226

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除