一.问题导出 今天在做算法题目的时候遇到了一道左右括号匹配的问题,问题如下: 二.问题思考 (1)这种要列出全部可能性的题目很容易想到由小到大去发现规律,用递归或者暴力搜索. 首先1的情况,一个括号只有一种可能,就是() 接着想2的情况,加个括号,可以在1的基础上加在其左边.右边或者包围住1,即()().()().(())去掉重复就剩下两种 同理3在2的基础上,都加上左边.右边.包住的括号 (2)用何种数据结构去存储括号呢?首先括号是字符串,再想到要去掉重复,所以想到用Hashset存储 三.代…
/**  * 功能:打印n对括号的所有有效组合(即左右括号正确配对). */ 两种方法: 方法一: /** * 思路:在括号的最前面或者原有的每对括号中面插入一对括号. 至于其它任何位置.比方字符串的末尾,都会跟之前的情况反复. * 注意:将字符串放进结果列表之前.必须检查列表有无反复. * @param remaining * @return */ public static HashSet<String> generateParens(int remaining){ HashSet<…
面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大的数组来存储传递的参数(因为可能有空间的限制),要%1000000007防止超出范围 package cc150.recursion_dp; public class GoUpstairs { public static void main(String[] args) { // TODO 自动生成…
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Note: Given n will be a positive integer. 题目分析:每次只能走1或2步,问n步的话有多少中走法???? 可以用动态规划和递归解…
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com 算法 递归 迭代 动态规划 斐波那契数列 MD 目录 目录递归和迭代什么是递归什么是迭代法递归和迭代的区别动态规划基本思想适用条件斐波那契数列递归法实现迭代法实现动态规划实现 递归和迭代 什么是递归 递归的基本概念:程序调用自身的编程技巧称为递归 一个函数在其定义中直接或间接调用自身的一种…
这周Java课程有个小作业:Java递归实现从n个数中选取m个数的所有组合 代码如下: //其中 n 取 1,2,3,4,5 五个数, m 取 3 package javaText; public class text { static int N = 5; static int M = 3; static int[] a= new int[]{1,2,3,4,5}; static int[] b = new int[M]; public static void main(String[] ar…
如题所述,当n=3时,可能的组合有:(()()), ((())), ()(()), (())(), ()()() 代码如下(有注释): import java.util.ArrayList; import java.util.List; public class Test06 { /** * 通过递归生成n对括号的全部有效组合 * @param list 装括号组合的容器 * @param leftRem 左括号剩余数量 * @param rightRem 右括号剩余数量 * @param bu…
1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记录每一个子问题的解 1.2 动态规划: 1, 从暴力递归中来 2, 将每一个子问题的解记录下来,避免重复计算 3, 把暴力递归的过程,抽象成了状态表达 4, 并且存在化简状态表达,使其更加简洁的可能 2,学会尝试才能掌握 2.1 P类问题和NP问题 P类问题:时间复杂度为多项式: 知道怎么算,让计算…
//递归         public static long recurFib(int num)         {             if (num < 2)             {                 return num;             }             else             {                 return recurFib(num - 1) + recurFib(num - 2);             }   …
一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest { public static void main(String[] args) { File dir =new File("e:\\java\\JavaSE基础视频"); listAll(dir,); } private static void listAll(File dir,int level)…
也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if change in coin_value_list: know_results[change] = 1 return 1 elif know_results[change] > 0: return know_results[change] else: for i in [c for c in coin_…
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. Below is one possible representation of s1 = "great": great / \ gr eat / \ / \ g r e at / \ a t To scramble the string, we may ch…
一.最长递增子序列(LIS) 给定数组arr,返回arr的最长递增子序列.例如,arr={2,1,5,3,6,4,8,9,7},返回的最长递增子序列为{1,3,4,5,8,9} 1.时间复杂度为O(N2)的方法 第一步:生成长度为N的数组dp,dp[i]表示在以arr[i]这个数结尾的情况下,arr[0...i]中的最大递增子序列长度,其中arr[0]=1 第二步:要计算dp[i],如果最长递增子序列以arr[i]结尾,那么在arr[0...i]中所有比arr[i]小的数都可以作为倒数第二个数.…
一.矩阵的最小路径和 1 3 5 9 1 4 9 18 1 4 9 18 8 1 3 4 9 9 5 8 12 5 0 6 1 14 14 5 11 12 8 8 4 0 22 22 13 15 12最小路径和最小的路径为:1 → 3 → 1 → 0 → 6 → 1 → 0 问题描述,给定矩阵m如上面所示,从左上角开始每次只能向右或者向下走,最后到达右下角,求最小路径和. 假设矩阵m的大小为M×N,首先生成大小和m一样的矩阵dp,dp[i][j]的值表示从开始位置(0,0)走到(i.j)位置的最…
一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开始):1,1,2,3,5,8...,也就是除了第1项和第2项外,对于第N项,都有F(n) = F(n-1)+F(n-2) 1.时间复杂度为O(2n)的暴力递归算法 暴力递归算法是最慢的一种方法,加入要计算F(10)的值,那么就要计算F(9)和F(8)的值,而计算F(9)的值需要计算F(8)和F(7)的值,…
题目链接:http://poj.org/problem?id=1661 解题报告: 1.老鼠每次来到一块木板上都只有两条路可以走,可以使用递归 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <memory.h> #define _MAX 1010 #define INF 0x3f3f3f3f struct Platform { int lx;//木板左端的坐标 int…
题目链接:http://poj.org/problem?id=2083 这题不能用G++提交... 见到两次知道有递归的写法,然而并不会,这次发现并不难: #include<stdio.h> #include<string.h> #include<iostream> using namespace std; ]= {,}, s[][]; void dfs(int n, int x, int y) { s[x][y]=; )return ; int m = len[n];…
2014-03-20 04:15 题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的.如果你不能旋转盒子变换长宽高,这座塔最高能堆多高? 解法:首先将n个盒子按照长宽高顺序排好序,然后动态规划,我写了个O(n^2)时间复杂度的代码. 代码: // 9.10 A stack of n boxes is form a tower. where every stack must be strictly larger than the one right above…
2014-03-20 04:04 题目:给你不限量的1分钱.5分钱.10分钱.25分钱硬币,凑成n分钱总共有多少种方法? 解法:理论上来说应该是有排列组合的公式解的,但推导起来太麻烦而且换个数据就又得重推了,所以我还是用动态规划解决. 代码: // 9.8 Given unlimited quarters(25 cents), dimes(10 cents), nickels(5 cents) and pennies(1 cent), how many ways are there to rep…
2014-03-20 03:27 题目:输出所有由N对括号组成的合法的括号序列.比如n=2,“()()”.“(())”等等. 解法:动态规划配合DFS,应该也叫记忆化搜索吧.一个整数N总可以拆成若干个正整数的和,执行搜索的时候也是按照这个规则,将N序列拆成多个子序列进行搜索,同时将中间的搜索结果记录下来,以便下次再搜到的时候直接调用,省掉重复计算的开销. 代码: // 9.6 Print all valid parentheses sequences of n ()s. #include <io…
2014-03-20 02:55 题目:从(0, 0)走到(x, y),其中x.y都是非负整数.每次只能向x或y轴的正方向走一格,那么总共有多少种走法.如果有些地方被障碍挡住不能走呢? 解法1:如果没有障碍的话,组合数学,排列组合公式C(x + y, x). 代码: // 9.2 How many ways are there to go from (0, 0) to (x, y), if you only go left or up, and one unit at a time? #incl…
/**  * 功能:给定数量不限的硬币.币值为25分,10分.5分.1分,计算n分有几种表示法. */ public static int makeChange(int n){ return makeChange(n,25); } /** * 递归的终止条件:全然简化为1分. * @param n * @param denom * @return */ public static int makeChange(int n,int denom){ int next_denom=0; switch(…
/**  * 功能:打印八皇后在8*8棋盘上的各种摆法.当中每一个皇后都不同行.不同列,也不在对角线上.  * 这里的"对角线"指的是全部的对角线,不仅仅是平分整个棋盘的那两条对角线. */ static int GRID_SIZE=8; /** * 思路:每一行仅仅能摆放一个皇后,因此不须要将棋盘存储为完整的8*8矩阵.仅仅需一维数组,当中columns[r]=c表示有个皇后位于r行c列. * @param row * @param columns * @param results…
一.汉诺塔问题(包括chapter 1中的汉诺塔问题) 二. 三. 四. 五. 六. 七. 八.…
下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hello world', 那么可以写这样的一个用例:访问该页面,获取该页面的title,判断获取的值是否等于'hello world'. 获取当前页面的url也是非常重要的一个操作. 在某些情况下,你访问一个url,这时系统会自动对这个url进行跳转,这就是所谓的'重定向'.一般测试重定向的方法是访问这…
题目描述 有一个int数组arr其中只含有1.2和3,分别代表所有圆盘目前的状态,1代表左柱,2代表中柱,3代表右柱,arr[i]的值代表第i+1个圆盘的位置.比如,arr=[3,3,2,1],代表第1个圆盘在右柱上.第2个圆盘在右柱上.第3个圆盘在中柱上.第4个圆盘在左柱上.如果arr代表的状态是最优移动轨迹过程中出现的状态,返回arr这种状态是最优移动轨迹中的第几个状态.如果arr代表的状态不是最优移动轨迹过程中出现的状态,则返回-1. 给定一个int数组arr及数组的大小n,含义如题所述,…
2014-03-21 20:20 题目:给定一个只包含‘0’.‘1’.‘|’.‘&’.‘^’的布尔表达式,和一个期望的结果(0或者1).如果允许你用自由地给这个表达式加括号来控制运算的顺序,问问有多少种加括号的方法来达到期望的结果值. 解法:DFS暴力解决,至于优化方法,应该是可以进行一部分剪枝的,但我没想出能明显降低复杂度的方法. 代码: // 9.11 For a boolean expression and a target value, calculate how many ways t…
2014-03-20 04:08 题目:八皇后问题. 解法:DFS解决. 代码: // 9.9 Eight-Queen Problem, need I say more? #include <cstdio> #include <vector> using namespace std; class Solution { public: void eigthQueens(int n, vector<vector<int> > &result) { ) {…
2014-03-20 03:35 题目:实现画图的Flood Fill操作. 解法:DFS和BFS皆可,但BFS使用的队列在时间复杂度上常数项比较大,速度略慢,所以我选了DFS.当然,如果图很大的话DFS是会导致call stack溢出的,那就摊上事儿了. 代码: // 9.7 Implement a flood fill painter that changes a certain area to a certain color. You are given one point as the…
2014-03-20 03:23 题目:给定一个字符串,输出其全排列. 解法:可以调用STL提供的next_permutation(),也可以自己写一个.对于这种看起来简单的题目,应该在能优化的地方,尽量想办法优化.在面试里如果大家都会做的题,你就得做的很好才能拉开差距,否则就等着thank you了. 代码: // 9.5 Print all permutations of a string. #include <algorithm> #include <cstdio> #inc…