DataStructure And Algorithm
freelamb
Do one thing, do it well.
展开
-
跳台阶
题目楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法。解答归纳当只有1阶台阶时,只有1种走法,只走1阶。 即n=1,f(1)=1当有2阶台阶时,一次走1阶有1种走法,一次走2阶有2种走法。 即n=2,f(2)=1+1=2当有n阶台阶时,从第n-1阶到第n阶走1阶有f(n-1)中走法,从第n-2阶到第n阶走2阶有f(n-2)阶走法。 即,f(n)=f(原创 2015-04-08 14:46:48 · 669 阅读 · 0 评论 -
快排分区函数
题目:算法:快排分区函数思路:并未真正的实现快速排序算法。快排分区函数:选择一个数,把数组的数分为两部分,把比选中的数小或者相等的数移到数组的左边,把比选中的数大的数移动到数组的右边,返回分区后的选中数所在的下标。对数组调用了分区函数之后: 1. 如果返回的下标是k-1,那么数组左边的k个数(数组下标从0到k-1),就是k个最小的数; 2. 如果返回的下标大于k,那么从下标之前的数组中再次调用原创 2015-09-12 22:41:06 · 1018 阅读 · 0 评论 -
方格(带对角线)的走法
题目m×n的方格,如下图所示,从方格的左下角A走到(只能向上或向右或斜向上右走)方格的右上角B,请求出所有的路径方法总和。原创 2015-09-13 08:50:44 · 4333 阅读 · 0 评论 -
顺序表基本操作的代码实现:C++实现
顺序表基本操作的代码实现原创 2015-08-30 16:17:06 · 16372 阅读 · 1 评论 -
求连续子数组的最大和
题目求子数组的最大和题目描述: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为:1 -1 1 1 -1 因此输出为该子数组的和为:2解答方法1:扫描法扫描整个数组,计算所有的可能结果,然后得到最大的结果为返回值。 这种实现方式,当数组足够大时,效率极差。C++程原创 2015-05-03 14:46:54 · 479 阅读 · 0 评论 -
从n个人中选择k个人的选法
题目从n个人中选选k个人组成一个委员会的不同组合数。解答分析从n-1个人到n个人,增加一个人,这个人可能被选中,也可能不被选中。若第n个人被选中则是从n-1个人中选择k-1个人,若第n个人没被选中,则是从n-1个人中选择k个人。即得以下公式: 由n个人里选k个人的组合数= 由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数;递归法得出推导公式: F(n,0) = 1; F(n,原创 2015-04-25 08:24:04 · 7484 阅读 · 3 评论 -
斐波那契数列
斐波那契数列原创 2015-04-21 14:19:47 · 851 阅读 · 0 评论 -
最后亮的电灯数
有n个灯排成一排,开始全部为灭。有n个学生,第一个学生把所有是1倍数的灯开关按一下(灯打开),此时所有灯都打开;第二个学生把所有是2倍数的灯按一下开关(开启变为关闭,关闭变为开启);第三个学生把所有是3 倍数的灯按一下……,以此内推,直到第n个同学把所有是n倍数的灯按一下开关。注:灯只有两种状态,开启和关闭,开启状态按一下可以转换为关闭状态,关闭状态按一下可以转换为开启状态。解答对于一个灯,无论原创 2015-04-09 14:05:35 · 775 阅读 · 0 评论 -
判断回文
题目判断是否为回文解答判断是否为回文就是判断正反两个数的大小是否相等。 例如: 121=121,正反都一样代码C++程序代码实现// 判断n是否为回文bool symm(unsigned n){ int i = n; int m = 0; while(i>0){ m = 10*m + i%10; i/=10; } return n原创 2015-04-24 09:54:48 · 641 阅读 · 0 评论 -
Java队列实现
Java队列实现队列定义栈(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端叫队尾(rear),允许删除的一端称为队头(front)。原创 2015-04-14 10:32:59 · 914 阅读 · 0 评论 -
不使用中间变量交换变量a、b变量
题目不使用中间变量交换变量a、b变量解答方法1用引用实现交换代码1void swap2(int& a,int& b){ int temp; temp=a; a=b; b=temp;}方法2用指针实现交换代码2void swap3(int* a,int* b){ int temp; temp=*a; *a=*b; *b=temp;原创 2015-04-14 14:12:35 · 1034 阅读 · 0 评论 -
Java栈的实现
栈定义栈(stack)是限定仅在表尾进行插入或删除操作的线性表。 对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地表头端称为栈底(bottom)。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的,因此,栈又称为后进先出(Last in first out)的线性表(简称LIFO结构)。原创 2015-04-13 15:39:23 · 790 阅读 · 0 评论 -
从尾到头打印链表
从尾到头打印链表题目输入一个链表,从尾到头打印链表每个节点的值。解答思路1:栈结构链表的特性:查找其中某一个结点的时间复杂度是O(n),不像数组那样可以直接通过下表在O(1)的时间内查找到指定元素。因此如果要查找链表元素,我们必须从头结点开始顺序往后查找。现在需要输出链表中的每个结点的值,而必须是从尾到头的,也就是先遍历的结点后输出,一个典型的“先进后出”的数据结构,这就让我们想到了栈的结构,如果我们在遍历链表的时原创 2015-04-13 13:06:35 · 788 阅读 · 0 评论 -
求一维数组中最小的k个值
题目:求一个一维数组中最小的k个数。解答:方案一:排序先把数组从小到大进行排序,取前k个数。时间复杂度为O(nlogn)。方案二:使用堆排序创建一个最小堆,初始化大小为k,堆顶为堆的最大元素;扫描一遍数组,往最小堆插入数据,如果堆的元素个数已经达到k,那么新元素需要和堆顶比较,如果小于堆顶,则移除堆顶,插入新元素;最终得到k个最小元素,时间复杂度为O(nlogk)。原创 2015-04-07 15:45:48 · 724 阅读 · 0 评论 -
方格的走法
[TOC]方格走法题目:m×n的方格,如下图所示,从方格的左下角A走到方格的右上角B,请求出所有的路径方法总和。解答:1*1方格的情况从左上角到右下角走法,总共有2种走法。即m=1,n=1 S(1,1)=22*2方格的情况从左上角到右下角走法,总共有6种走法。即m=2, n=2 S(2,2)=S(2,1)+S(1,2)=3+3=6m*n方格的情况从左上角到右下角走法,总共有S(m,n)种走法。原创 2015-04-07 15:17:00 · 7099 阅读 · 0 评论 -
二维数组查找
题目二维数组中的查找在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如: 1,2,5 3,4,9 7,8,213*3的数组解答思路从二维数组的右上角的元素开始判断,因为此元素是它所在行的最大数,是它所在的列的最小数。如果它等于要查找的数字,则查找过程结束。如果它大于要查找的数原创 2015-04-11 16:45:06 · 1055 阅读 · 0 评论 -
纸币的组成问题
题目纸币的组成问题描述用1元,2元,5元,10元,20元,50元和100元的纸币组成n元,共有多少种情况。分析此题可使用递归解决将组成的单数纸币保存到数组,放入如下:int a[6] = {1, 5, 10, 20, 50, 100};由前j种组成的纸币n包括两种:一种是一定包括第j种纸币;即getSumCount(n-a[j], j)另一种是一定不包括第j种(即由0到j-1种)组成,即getSum原创 2015-10-01 19:10:21 · 1007 阅读 · 0 评论