算法设计
南山93
一枚普通的程序员。个人作品,打字侠。
展开
-
矩形覆盖(java)
一、问题描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?二、算法分析解题思路:归纳法(列举出n=1,2,3,4,5,总结规律)分析可知,f(n)可以按照两种方式扩展,一种是f(n-1)组合1个2*1,另一种是f(n-2)组合2个2*1三、算法设计递归或者迭代法四、编码实现publ原创 2016-11-06 16:47:32 · 415 阅读 · 0 评论 -
并发模型(二)——Master-Worker模式
Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务;Worker进程,负责处理子任务。当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果。一、什么是Master-Worker模式:该模式的结构图: 结构图:转载 2017-05-14 22:32:42 · 405 阅读 · 0 评论 -
对称矩阵与压缩存储算法(java实现)
一、问题描述实现一个对称矩阵的压缩存储二、算法分析对称矩阵的特点:a[i][j] = a[j][i].即所有元素关于对角线对称所以可以将对称矩阵的下三角存储在一个数组对象SA中,存储方式是,SA[0] = a[0][0]SA[1] = a[1][0] SA[2] = a[1][1]SA[3] = a[2][0] SA[4] = a[2][1] SA[5] =原创 2016-11-02 17:07:40 · 2143 阅读 · 1 评论 -
青蛙跳台阶改良版:变态跳台阶
一、问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。二、算法分析设f(n)表示青蛙跳到第n阶台阶总共的跳法,则f(n-1)表示青蛙跳到第n-1阶台阶总共的跳法f(n-2)表示青蛙跳到第n-2阶台阶总共的跳法。。。f(1)表示青蛙调到第1阶台阶总共的跳法所以,f(n) = f(n-1)+f(n-原创 2016-11-02 15:04:51 · 540 阅读 · 0 评论 -
青蛙跳台阶(java)
一、问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。二、算法分析因为青蛙一次只能跳上1级台阶或者两级台阶,所以对于第n级台阶来说,青蛙只能从第n-1级台阶或者第n-2级台阶跳上。设青蛙跳上第n级台阶有f(n)种跳法,则f(n) = f(n-1)+f(n-2),n>2f(2) = 2f(1) = 1三、算法设计两种原创 2016-11-02 14:37:25 · 3923 阅读 · 3 评论 -
斐波那契数列的两种解题思路:递归VS迭代
一、问题描述要求输入一个整数n,请你输出斐波那契数列的第n项二、算法分析给出一系列斐波拉契数列:0 1 1 3 5 8 13 21 。。。通过观察,很容易发现: 1 n=0,1f(n) = f(n-1)+f(n-2) n>1三、算法设计递归法:根据递归公式实现递归函数缺点:递归过程中会包含很多重复的运算,所以原创 2016-11-02 11:07:35 · 11202 阅读 · 1 评论 -
两个栈实现一个队列(java)
一、问题描述使用两个栈实现一个队列二、算法分析栈是先进后出,因此两个可以模拟实现先进先出三、算法设计定义数据结构Stack stack1Stack stack2对于push操作:元素入队列时,将其加入到stack1中对于pop操作:元素出队列时,先判断stack2是否为空,若不为空,则从stack2中弹出一个元素;若为空,则将stack1中的所有元素弹出到sta原创 2016-11-01 16:11:52 · 567 阅读 · 0 评论 -
重建二叉树(java)
一,问题描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二,算法分析中序特点:左子树 根 右子树 (左子树,右子树同理)前序特点:根 左子树 右子树 (左原创 2016-11-01 15:12:49 · 407 阅读 · 0 评论 -
从尾到头打印链表(java)
1.问题描述输入一个链表,从尾到头打印链表每个节点的值。2.算法分析方案一(非递归版):构造一个栈,将链表中所有元素存入栈中,然后使用该栈构造ArrayList方案二(递归版):在顺序遍历链表的同时不断调用自身同时将各个节点的值存入数组中,由于递归程序先执行最底层的被调用程序,所以节点的值逆序保存在数组中3.算法设计方案一:定义数据结构:(1)Stack stack原创 2016-10-31 16:05:22 · 470 阅读 · 0 评论 -
替换空格(java)
1.问题描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。2.算法分析创建一个空的字符串newStr,扫描当前字符串,如果是空白符则替换成“%20”,追加到newStr中;如果是其他字符则追加到newStr中3.算法设计处理对象:StringBuffer str定原创 2016-10-31 14:57:52 · 395 阅读 · 0 评论 -
二维数组中的查找(java版)
1.问题描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2.算法分析二维数组特点:每一行都是递增有序,每一列都是递增有序。根据二维数组的特点,查找一个待定元素target,首先与array[i][j]比较。结果分以下三种情况:(1)target == arr原创 2016-10-31 10:49:44 · 568 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面(java)
一、问题描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。二、算法分析给定一个数组array目标:调整数组中元素顺序,使得奇数在前,偶数在后,同时奇数区和偶数区元素相对于原数组顺序不变例如,array = {1,2,3,4,5,6}调整后,array原创 2016-11-06 18:52:30 · 3073 阅读 · 2 评论 -
二进制中1的个数(java)
一、问题描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。二、算法分析方案一:任何一个十进制整数在机器上存储的都是二进制形式,如果该数为整数,则存储的就是该数的二进制形式;如果该数为负数,则存储的就是该数的二进制补码形式。方案二:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在原创 2016-11-06 17:10:21 · 1584 阅读 · 0 评论 -
最短路径问题(Dijkstra算法)学习心得
一、前言在离散数学的学习过程中,遇到了最短路径问题。Dijkstra算法求解单源最短路径本身不易理解,本文综合自己的理解试图给出Dijkstra算法形式化描述以及示例。二、相关概念最短路径问题:给定带权图G=<V,E,W>及节点u和v,其中每一条边e的权重W(e)为非负数,求从u到v的最短路径。最短路径性质:如果 是从u到v的最短路径,则对每一个 , 是 的最短路径。(...原创 2019-01-08 23:53:20 · 5917 阅读 · 2 评论