C++经典算法题

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

假设f(n)是n个台阶跳的次数。

  1. f(1) = 1

  2. f(2) 会有两个跳得方式,一次1阶或者2阶,这回归到了问题f(1),f(2) = f(2-1) + 1 =2

  3. f(3) 会有三种跳得方式,1阶、2阶、3阶,那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3).因此结论是
    f(3) = f(3-1)+f(3-2)+1=4

  4. f(n)时,会有n中跳的方式,1阶、2阶...n阶,得出结论:

f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + 1 

=> f(n-1)=f(n-2)+...+f(n-(n-1)) + 1 

=>f(n) = 2*f(n-1)     (n>=3)   f(2)=2f(1)同样成立,所以

f(n) = 2*f(n-1)     (n>=2) 

所以,可以得出结论

代码如下(递归实现):
int func(int target)
{
    if(target<=0){ 
        return 0;
    }
    if(1==target){
        return 1;
    }
    return 2*func(target-1);
}


2、一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有 多少总跳法。

思路:

如果只有1 级台阶,那显然只有一种跳法;

如果有2 级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1 级;另外一种就是一次跳2 级。

一般情况:把n 级台阶时的跳法看成是n 的函数,记为f(n)。

    当n>2 时,第一次跳的时候就有两种不同的选择:

    一是第一次只跳1 级,此时跳法数目等于后面剩下的n-1 级台阶的跳法数目,即为f(n-1);

    另外一种选择是第一次跳2 级,此时跳法数目等于后面剩下的n-2 级台阶的跳法数目,即为f(n-2)。

因此n 级台阶时的不同跳法的总数f(n) = f(n-1) + f(n-2)。


用一个公式表示:

       /  1  (n=1)
f(n) =  2  (n=2)
       \  f(n-1) + (f-2)  (n>2)

咦,这不是Fibonacci数列吗!

时间复杂度:O(n)

第一个方法:递归

int jump(int n)
{
    if(n<=0) 
        return 0;
    if(1==n||2==n)
        return n;
    return jump(n-1)+jump(n-2);
}

第二种方法:循环

int jump(int n)
{
    if(n<=0) 
        return 0;
    if(1==n||2==n){
        return n;
    }
    else{
        prepre=1; 
        pre=2;
        res=0;
        for(i=3;i<=n;i++){
            res=prepre+pre;
            prepre=pre;
            pre=res;
        }
    return res;
    }
}


展开阅读全文

没有更多推荐了,返回首页