随笔分类 - 【9】算法基础
备战2019年第十届蓝桥杯大赛
摘要:题目: 给定整数序列a1,a2,...,an,判断是否可以从中选出若干数,使它们的和恰好为k。1≤n≤20 -108≤ai≤108 -108≤k≤108 输入: 输出: 思路: 这里记录一下为什么会想到用子集去做这道题目,这道题目是关于从几个数中找出几个关于符合某种关系的数,呐,根据模式匹配法很容易
阅读全文
摘要:DFS(深度优先搜索): 深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行
阅读全文
摘要:对于一些算法问题,求次数,种类数(答案就是一个具体的数值)这些,如果有封闭形式就可以直接解,就不用去编码大量的代码了。那我们看一个例子吧。 汉诺塔移动次数: 我们以前是求汉诺塔的移动方式,那现在要求移动多少次,那该怎么做呢?我们可以先看汉诺塔的移动次数递归式 f(n) = 2f(n-1)+1 。那是
阅读全文
摘要:题目: 编写一个方法,确定某字符串的所有排列组合。 解法一: 代码: 结果: 解法二:交换法,大体意思就是不开辟新的辅助空间,直接在原有的数组中进行两个元素的交换即可,但是要注意这种方法必须要进行回溯。 代码: 结果: 例题: LeetCode60 n个数的排列组合找出第k个排列。 思路:在上面的代
阅读全文
摘要:题目: 给定一个int数组A和数组的大小n,编写一个方法返回集合A的所有子集。注意集合里面的元素互异。 解这道题的思想本质上就是元素选与不选的问题。由此大概有三种方法解这道题。 递归法:如果只有一个元素,那么它的子集有两个,分别是本身和空集,然后在已经有一个元素的子集的基础上,第二个元素有两种选法,
阅读全文
摘要:题目一: 输入括号对数,输出所有的合法组合,比如输入1,输出"()",输入3,输出"()()(), (()()), ()(()), (())(), ((()))"。 思路:比如输入1,输出"()",那么输入2的话,我们就可以在输入1的基础上往左插入一对括号,往右插入一对括号以及把它用括号包含起来。这
阅读全文
摘要:一、题目: 假设我们有8种不同面值的硬币{1,5,10,25},用这些硬币组合构成一个给定的数值n。 例如n=100,那么一种可能的组合方式为 100 = 2*25+5*5+2*10+5*1。 问总共有多少种可能的组合方式? 二、思路: 先来看看递归解法,看到这种题目,不要一上来就想着我怎么来划分任
阅读全文
摘要:一、问题: 有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。 请设计一个算法,计算机器人有多少种走法。 给定两个正整数int x,int y,请返回机器人的走法数目,保证x+y小于等于12。 二、思路: 思考这类看起来很复杂的问题,实际上就越有规律可循,我们先列举一
阅读全文
摘要:快速幂运算: 快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下: 假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==
阅读全文
摘要:素数定理:给出从整数中抽到素数的概率。从不大于n的自然数随机选一个,它是素数的概率大约是1/ln n。也就是说在不大于n的自然数里,总共的素数为 n/lgn。 筛法: 用筛法求素数的基本思想是(本质上也能算是一种预处理):把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。
阅读全文
摘要:import java.util.HashMap; import java.util.Map; public class PrimeNumber { public static void main(String[] args) { boolean res = isPrime(7); System.out.println(res); Map map = primeFactor(1...
阅读全文
摘要:同余方程组: 先来看一道题目:有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何? 然后我们可以做如下变换,设x为所求的数。 x%3=2 x ≡ a1(%m1) ① x%5=3 > x ≡ a2(%m2) ② x%7=2 x ≡ a3(%m3) 根据前面两式可以得到 x = a1+m1
阅读全文
摘要:逆元: 同余方程 ax≡1(mod n),gcd(a,n) = 1 时有解,这时称求出的 x 为 a 的对模n的乘法逆元。(注意:如果gcd(a,n)如果不等于1则无解),解法还是利用扩展欧几里得算法求解方程 ax + ny = 1 求出 x。 题目:HDU-1576 思路:设(A/B)%9973
阅读全文
摘要:模运算: 取模:计算除以m的余数,叫做对m取模 同余:将a,b对m取模的结果相同,记为 a ≡ b (mod m)(例如: x % 3 = 2 > x ≡ 2(%3),x余3等于2,和2同余),即 a mod m == b mod m 如果 a ≡ b (mod m),且c ≡ d (mod m),
阅读全文
摘要:题目: 思路:暴力搜索或者扩展欧几里得算法( 97x-127y=1 ax+by=m ) 代码:
阅读全文
摘要:先来看看欧几里得算法: 接着再来看裴蜀(贝祖)等式:对于任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):ax+by = m 有整数解时当且仅当m是d的倍数。x、y可用扩展欧几里得算法求得。特别地,方程ax+by=1 有整数解当且仅当整数a和b互质。 那什么是扩展
阅读全文
摘要:先来看看Nim定理: 再来看这道题目: 我们可以将和尚从后往前(从左到右)两两配对,若为奇数则在最高位补充一个假想的和尚,在同一对和尚中,如果对手移动前一个和尚,你总能移动后一个和尚相同的步数,所以一对和尚的前一个和尚与前面一对和尚的后一个和尚之间有多少台阶是没有影响的。所以只要考虑同一对和尚之间有
阅读全文
摘要:注意程序输出:+号代表放在左盘,-号放在右盘。 思路:联想二进制枚举,这里显然其实是一种三进制枚举。 这里本质上是选或不选的问题,就是要将砝码放左or放右即+or-表达式的问题。但是得到的三进制值是由0 1 2组成,不好准确的表达是选还是不选的问题,于是我们可以想办法把0 1 2变成1 0 -1。于
阅读全文
摘要:题目:给定一个字符串,求最长重复子串,这两个子串不能重叠。例如,str = "acdcdcdcd",则不可重叠的最长子串为"cdcd"。 思路:二分枚举+height数组分组。这道题的思想很巧妙,后面要仔细推敲。先二分答案,把题目变成判定性问题:判断是否存在两个长度为k的子串是相同的,且不重叠。解决
阅读全文