摘要:
有一类问题,是逐步生成结果的形式,有明确的递推形式,边界非常明确,比较容易用迭代形式实现,用递归也有较为明确的层数和宽度 ,这类问题,能用迭代就用迭代,用递归很大可能会超时,当然封闭形式的解最好。例如:走楼梯,走方格,硬币表示,括号组合,子集,全排列。 有另外一类问题,解的空间很大(往往是阶乘级别的 阅读全文
摘要:
题目: 问题描述:如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串。如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困难的。 输入正整数L,n,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难 阅读全文
摘要:
题目: 输入正整数n,对1-n进行排列,使得相邻两个数之和均为素数,输出时从整数1开始,逆时针排列。同一个环应恰好输出一次。n<=16 如输入: 输出: 代码: 结果: 阅读全文
摘要:
回溯: 递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯。下一个状态在开始之前需要利用到之前的状态,此时需要进行回溯,因为之前的状态对现在的状态存在着影响。 剪枝: 深度优先搜索的时候如果已经明确 阅读全文
摘要:
题目: 有一个大小为 N*M 的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对 W 的*的部分) 限制条件:N, M ≤ 100 样例输入: 园子如下图('W'表示积水, '.'表示没有积水) 输出: 思路: 这道题目很经典,值得以后多去研 阅读全文
摘要:
题目: 给定整数序列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不是素数,首先把它筛掉。 阅读全文