==========算法很美==========
文章平均质量分 53
海伦•
求知若渴,大智若愚
展开
-
开启力扣的python之旅
因为之前虽然学过算法,但是还没有用python编程的习惯,为了更加熟悉python的语法,所以这里就选择使用python。虽然算法很简单,但是对python入门还是挺有用的。两数之和题目:给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,...原创 2021-09-19 21:09:22 · 273 阅读 · 0 评论 -
合法括号
cc150 9.6分析:对于非数值型递归就得用容器去装啦 这里的Set就是几个去重的集合容器 生成一点装一点点,所谓迭代就是慢慢改变import java.util.HashSet;import java.util.Set;public class Main { public static void main(String[] args) { //Set为去重的集...原创 2019-04-23 15:23:30 · 294 阅读 · 0 评论 -
机器人走格子(递归 / 动态规划)
cc150 9.2分析:动态规划是有小到大得进行 递归表面从大到小,实际从小到大import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int x = sca.nextIn...原创 2019-04-23 14:55:21 · 1079 阅读 · 0 评论 -
数字三角形(dp)
1,二维从上到下规划分析:如果用dfs,下面就会存在重叠求上方某一位置最大值的情况 这种情况下并没有重新开辟空间,一不失为一种好方法import java.util.Scanner;public class Main { public static int n; public static int a[][]; public static void main(...原创 2019-04-27 10:41:25 · 232 阅读 · 0 评论 -
走楼梯
来自cc150 9.1分析:递归将由简单到复杂 如果次数明确的情况下选择迭代方法import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int n ...原创 2019-04-23 09:50:39 · 524 阅读 · 0 评论 -
快速幂运算
快速设计一个a的n次幂的算法 利用二进制进行巧算public class Main { public static void main(String[] args) { //求a的n次方 int a = 12; int n = 10; //m与n进行相与来判断对应的mt是否应该乘入res结果 ...原创 2019-04-23 08:44:06 · 104 阅读 · 0 评论 -
第十万个素数(埃式筛法)
知识点:整数n内大概有n/log(n)个素数 埃式筛法:从左到右,遇到素数,将素数的倍数标记为非素数,然后继续这样筛。 特别当素数个数要求求的次数非常多,就特别推荐埃式筛法public class Main { public static boolean arr[] ; public static void main(String[] args) { //求第N个质数 ...原创 2019-04-23 08:15:51 · 702 阅读 · 1 评论 -
质因数分解
只需 判断到根号n出,就可以知道该数是否为质数 当从最小质因子去重之后后面较小的非质数就不可能成为他的因子。所以说最后他的因子都是质数。(数论)public class Main{ public static void main(String[] args) { int n = 100; Map<Integer, Integer> map = new Ha...原创 2019-04-22 21:37:50 · 241 阅读 · 0 评论 -
欧几里得法
大神的思想:一行解决最大公约数(递归调用自己)求两个数的最大公约数:辗转相除法public class Main { public static void main(String[] args) { int a = 344; int b = 44; int x; // a > b x = gcd(a,b); System.out.println(...原创 2019-04-22 21:04:44 · 193 阅读 · 0 评论 -
计数排序
分析:当数字范围一定,规模比较大的情况下我们可以采用以空间换时间的方法(计数排序)import java.util.Arrays;public class Main { public static int n = 10000000; public static int a[] = new int[10000001]; public static int b[] = new int...原创 2019-04-18 15:54:58 · 99 阅读 · 0 评论 -
硬币问题(贪心)
动态规划和贪心算法都是一种递推的方法,当存在最优子结构的时候,用动态规划,贪心是动态规划的特例注意:那么当存在最的时候就要想到贪心和动态规划1.深度优先剪枝策略分析 :先按大的选,有结果就输出,没结果就倒退,选到出最佳方案后就就退出(剪枝)import java.util.Scanner;public class Main { public static int...原创 2019-04-25 11:12:20 · 843 阅读 · 0 评论 -
边界为1的最大子方阵(模拟+动态规划)
分析:这里不使用直接暴力枚举的方法,而是使用最大最先算的最优算法。这里的思考方式值得学习。方法一:使用模拟的方法,模拟寻找过程(从大到小顺序查找,找到就停止)public class Main { public static int a[][] = { {1,1,1,1,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,...原创 2019-04-19 17:41:12 · 601 阅读 · 0 评论 -
顺时针打印二维数组
分析:看变化:变化的是上下左右边界 简化:首先打出第一行,注意没打出一点就检验一遍,这样有减少错误复杂度 具体实现:套上外层循环public class Main { public static int a[][] = { {1,2,3,4}, {5,6,7,8}, {9,20,11,12}, {13,14,15,16} }; public sta...原创 2019-04-19 16:37:11 · 271 阅读 · 0 评论 -
Z形打印(模拟)
分析:将模型简单化,分为向斜上方走和向斜下方走,当遇到边界时就处理当步该走方向 变化整体方向 flag = !flagpublic class Main { public static int a[][] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; public static void main(String[] a...原创 2019-04-19 16:35:52 · 202 阅读 · 0 评论 -
困难的子串
分析:char ch = (char) ('A' + i);时记得转为字符,否则会变为A0,A1字符串或者其他字符串 判断字符串是否为苦难字符串时直接用截取的方法看是否有重复且相邻的字符串没考虑到以B开头的代码import java.util.Scanner;public class Main { public static int n; //第n个最小困...原创 2019-04-24 09:19:29 · 149 阅读 · 0 评论 -
n皇后
分析 : 从上往下依次放入皇后,可以成功放满n个皇后,count++ 下一个无法放,则撤销一个,尝试,若仍然通再撤回,以此类推 将n的值可以改变来控制皇后的数量public class Main { public static int N = 8; public static int count = 0; public static boolean fa...原创 2019-04-24 08:05:52 · 161 阅读 · 0 评论 -
部分和
分析:用模式匹配方法,他类似于非空子集的求解方式 用递归的方法(两个选择,选和不选)类似于选硬币(选和不选)import java.util.ArrayList;public class Main { public static int[] a = {1, 2, 34, 5, 5}; public static int nl = a.length; public sta...原创 2019-04-23 21:05:16 · 166 阅读 · 0 评论 -
封闭形式的直接解
例:(转化为数学问题)汉罗塔:求它的移动次数的时候,就不用模拟移动过程 f(n ) = 2 f ( n - 1) + 1;用数学归纳法:对应值为: 1 3 7。。。 。。。 n - 1归纳得: f(n) = - 1证...原创 2019-04-23 20:26:50 · 1046 阅读 · 0 评论 -
完全背包问题
01背包现在对题目的要求不是每种物体只有一个而是想要多个都有。所以讲01背包问题转化为完全背包问题。下面为完全背包的代码注意:这里因为要用到当行变化的情况。所以不能像01背包那样最后优化为一维数组。 状态转移方: if(j - w[i] >= 0){ dp[i][j] = max(dp[i -...原创 2019-04-28 10:52:58 · 170 阅读 · 0 评论 -
最长公共子序列(dp)
题目:求两个字符串的最长公共子序列(注意并不应要求是连续的哦)分析:用动态规划找出dp方程时注意要用到的是二位数组,因为当次循环可能会用到的是没有被改变的原始值,而不是动态变化的 dp方程:当找到匹配的一个字符串时 : dp [i][j] = max( dp[i - 1][j -1] + 1,dp[i - 1][j]); 当未有匹配的字符时 dp...原创 2019-04-27 21:40:08 · 638 阅读 · 0 评论 -
必备求和公式
原创 2019-04-22 20:03:12 · 469 阅读 · 0 评论 -
阶梯尼姆博弈
Georgia and BobPOJ - 1704运行超时代码:import java.util.Arrays;import java.util.Scanner;//时间超时public class Main { public static int n; public static int a[][]; public static void main(St...原创 2019-04-22 19:59:10 · 272 阅读 · 0 评论 -
购物最大价值物品(01背包)
动态规划:最优子问题 或者 子问题最优性的一般算法 找出dp方程 解决重叠子问题(减少求解次数)是记忆型递推、递归1.递归解决个人觉得这种方法更加容易理解重点是将无脑的递归转化为,有记忆形式的递归。(也就是去掉重复计算)也就是利用空间交换时间上的效率。import java.util.Scanner;public class Main { pu...原创 2019-04-26 21:35:10 · 391 阅读 · 0 评论 -
递归形式进行插入排序
注意要点:要限制k >= 0 并且 要在 end < a[k] 之前 最后要 k ++import java.util.Scanner;public class 递归形式进行插入排序 { public static int[] a; public static int n; public static void main(String[] args) { S...原创 2019-04-16 19:22:32 · 362 阅读 · 0 评论 -
字符串匹配__RabinKarp
Michael O. Rabin和Richard M. Karp在1987年提出一个想法,即可以对模式串进行哈希运算并将其哈希值与文本中子串的哈希值进行比对。总的来说这一想法非常浅显,唯一的问题在于我们需要找到一个哈希函数 ,它需要能够对不同的字符串返回不同的哈希值。例如,该哈希函数可能会对每个字符的ASCII码进行算,但同时我们也需要仔细考虑对多语种文本的支持。...原创 2019-04-20 21:28:45 · 179 阅读 · 0 评论 -
将字符串按单词翻转(str.split(" "))
分析:这里可以使用a.split(" ")可以快速分割单词public class Main { public static void main(String[] args) { String a = "Here you are!"; //切割单词 String word[] = a.split(" "); int n = word.length...原创 2019-04-20 20:40:21 · 218 阅读 · 0 评论 -
替换字符串中的空格( str.replaceAll)
如果了解API直接使用下面方法方法一:public class Main { public static void main(String[] args) { String a = "a fk dv",b; b = a.replaceAll("\\s", "%20"); System.out.println(b); }}运行结果:a%20f...原创 2019-04-20 20:06:15 · 1789 阅读 · 0 评论 -
巧妙翻转字符串(StringBuffer /StringBuilder)
直接使用javaAPI中的StringBuffer或者StringBuilder(可变字符串)巧妙方法一:public class Main { public static void main(String[] args) { StringBuffer stbuf = new StringBuffer("asdf"); System.out.println(stbuf....原创 2019-04-20 19:48:05 · 265 阅读 · 0 评论 -
判断字符串有无重复字符(ASCII码和Unicode的区别)
来自cc150分析:ASCII码和Unicode的区别1.ASCII的特点ASCII 是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH)。这对于英文而言,是没有问题的,一般只什么用到前128个(00H--7FH,最高位为0)。而最高位为1 的另128 个字符(80H—FFH)被...原创 2019-04-20 19:27:19 · 1351 阅读 · 0 评论 -
矩阵与矩阵的乘法运算
分析:a矩阵的行为ab矩阵的行数 b矩阵的列数为ab矩阵得列数 将乘的次数为a矩阵的列数,= b矩阵的行数public class Main { public static int a[][] = { {1,2}, {1,-1} }; public static int b[][] = {...原创 2019-04-20 17:38:09 · 4106 阅读 · 0 评论 -
子阵最大累加和(dp)
分析:如果直接用暴力法,时间复杂度可以达到0(*) 但行用到dp的方法可以将时间复杂度降到O(*n)public class Main { public static int a[][] = { {1,1,1,1,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,1}, {1,0,0,0,1,1}, {...原创 2019-04-20 17:06:10 · 128 阅读 · 0 评论 -
一题三解:二进制中1的个数
方法一:移动该数import java.util.Scanner;//计算9对应的二进制1001的1的个数public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int n , t = 1 , ct = 0; ...原创 2019-04-15 20:56:10 · 196 阅读 · 0 评论 -
如何找数组中唯一成对的那个数
import java.util.Scanner;//以下使用的是位运算的方法,不利用辅助空间public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int n ; // 表示总共有n个数, 重复一个数 int t = 0...原创 2019-04-15 20:26:42 · 191 阅读 · 0 评论 -
hiho字符串
/* hiho字符串时间限制:10000ms单点时限:1000ms内存限制:256MB描述如果一个字符串恰好包含2个'h'、1个'i'和1个'o',我们就称这个字符串是hiho字符串。 例如"oihateher"、"hugeinputhugeoutput"都是hiho字符串。现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。输入...原创 2019-04-21 17:08:01 · 129 阅读 · 0 评论 -
汉罗塔
找公式找重复:划分子方法,将n 分为第n 个盘 和 n - 1 个盘两部分 找变化:变化的是盘子的个数,和它的起始柱子,目标柱子和辅助柱子得出要使用的递归参数dfs(int n ,String from ,String to,String help)找出口n == 1 跳出import java.util.Scanner;public class Main { publ...原创 2019-04-16 21:15:44 · 332 阅读 · 0 评论 -
Nim游戏(博弈)
分析:利用数论得出的公式:当先开始拿的人,面对的结果异或不为0,那么他就可以把结果异或为零,最终他会赢 反之,先开始拿的人面对的是时异或为0,那么他的对手总可以把结果异或为0,最终他的对手会赢。import java.util.Scanner;public class Main { public static int n; public static void main...原创 2019-04-22 17:23:46 · 188 阅读 · 0 评论 -
调整数组顺序_奇数在左偶数在右
利用快排的思想将其左右成两分块,使指针在两端切换并且要先判断指针是否在指定范围内,再才能判断大小,要不然很容易越界快速排序public class Main { public static int a[] = {2,21,2,13,1,13,22,1313,13,2}; public static void main(String[] args) { for(int ...原创 2019-04-17 21:52:34 · 328 阅读 · 0 评论 -
快速排序
注意:在每次移动指针时要判断条件左边小于右边 每完成一次快排,就将该组数以起始第一个数为边界,左边为大于他的数,右边为小于他的数 public class Main { public static int a[] = {2,21,2,13,1,13,1313,1313,13,2}; public static void main(String[] args) { f...原创 2019-04-17 21:41:56 · 112 阅读 · 0 评论 -
快速设计一个a的n次幂的算法(经典例题)
分析:每次进行翻倍的话也就是目的次数折半,就可以将算法的时间复杂度简化到O(logn) 实现方法第一次翻2倍,第二次4倍,...,第n次2的n次方倍。就可以达到目的public class Main { public static void main(String[] args) { int result = powI(2,20); Sy...原创 2019-04-17 20:26:10 · 1918 阅读 · 0 评论 -
天平称重(巧用三进制)
分析:对砝码的放左放右,还是不放,可以最后用1,-1,0表示,类似于二进制的1表示放,0表示不放。 结果变化的时候利用进位的思想。当为2时接一位低位,进一位高位。import java.util.ArrayList;import java.util.Scanner;public class Main { public static int n; ...原创 2019-04-22 17:04:32 · 455 阅读 · 0 评论