常见数据结构与算法题

范畴:递归

1、青蛙跳台阶

青蛙跳台阶算法,每次可以跳1级或两级,请问有n级台阶,有多少种算法,递归和非递归如何写

  • 递归:

    public int JumpFloor(int n)
     {
       if (n < 0)
           return 0;
       int[] fibArry = { 0, 1, 2 };
       if (n < 3)
           return fibArry[n];
       return JumpFloor(n - 1) + JumpFloor(n - 2);
     }
    
  • 非递归:

    public int JumpFloor(int n)
      {
          if (n < 0)
              return 0;
          int[] fibArry = { 0, 1,2 };
          if (n < 3)
              return fibArry[n];
          long nReturn = 0L;
          long fibFirst=1L;
          long fibTow=2L;
          for (int i = 3; i <= n; i++)
          {
              nReturn = fibFirst + fibTow;
              fibFirst=fibTow ;
              fibTow = nReturn;
          }
          return nReturn;
      }
    

2、变态跳台阶 来自牛客网

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

分析:
关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3)
...
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n)

说明:
1)这里的f(n) 代表的是n个台阶有一次1,2,...n阶的 跳法数。
2)n = 1时,只有1种跳法,f(1) = 1
3 ) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)
4 ) n = 3时,会有三种跳得方式,1阶、2阶、3阶,
那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)
因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)
5 ) n = n时,会有n种跳的方式,1阶、2阶...n阶,得出结论:
f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1)

由以上已经是一种结论,但是为了简单,我们可以继续简化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:f(n) = 2f(n-1)

7 ) 最终结论 在n阶台阶,一次有1、2、...n阶的跳的方式时,总得跳法为:

          | 1        ,(n=0 ) 
f(n) =    | 1        ,(n=1 )
          | 2*f(n-1) ,(n>=2)

代码:

public class Solution {
public int JumpFloorII(int target) {
    
    if(target < 0){
        return -1;
    }else if(target == 0 || target == 1){
        return 1;
    }else{
        return 2*JumpFloorII(target-1);
    }
}
}

范畴:树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树
假设输入的 前序遍历 和 中序遍历 的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8} 和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

/**
*Definition for binary tree
*struct TreeNode {
*int val;
*TreeNode *left;
*TreeNode *right;
*TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/

class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {

    int inlen = in.size();
    if(inlen == 0){
        return NULL;
    }
    vector<int> left_pre,right_pre,left_in,right_in;
    
    // 创建根节点,根节点肯定是 前序遍历 的第一个数
    TreeNode* head = new TreeNode(pre[0]);
    
    // 找到 中序遍历 根节点所在位置,存在变量gen中
    int gen = 0;  // 从中序遍历中找到的 根节点的坐标
    for(int i = 0; i < inlen; i++){
        if(in[i] == pre[0]){
            gen = i;
            break;
        }
    }
    // 接下来两个for循环判断:哪些元素属于该根节点的左边,哪些属于右边
    
    // 对于中序遍历,根节点左边的节点位于二叉树的左边,根节点右边节点位于二叉树右边
    // 利用这一点对二叉树进行归并,先判断左边的
    for(int i = 0; i < gen; i++){
        left_in.push_back(in[i]);
        left_pre.push_back(pre[i+1]); //+1跳过前序的根节点
    }
    for(int i = gen+1; i < inlen; i++){
        right_in.push_back(in[i]);
        right_pre.push_back(pre[i]); //这里不用加1
    }
    // 和shell排序的思想类似,取出前序和中序根节点左边和右边的子树,
    // 也就是前面两个for循环中保存起来的前序和中序的左右子树数组
    // 递归电泳该方法直到叶子节点
    head->left = reConstructBinaryTree(left_pre,left_in);
    head->right = reConstructBinaryTree(right_pre,right_in);
    
    return head;
}
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容