zl程序教程

您现在的位置是:首页 >  后端

当前栏目

爬楼梯-c语言力扣最快算法

算法语言 力扣 最快 爬楼梯
2023-09-14 09:06:53 时间

爬楼梯-c语言力扣最快算法

今天做了一个爬楼梯的题目,个人觉得题目很有趣,下面是题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶
    . 在这里插入图片描述
    速度打败了所有的对手。

这个题目其实需要用数学的思维去解决,我们需要去学习一些排列组合的题目去应付这个题目
我的算法思想很简单,遍历走两步的情况。从只有0个2阶到n/2个2阶,并用排列组合方法解出答案,但是这题如果用到排列组合同时需要小心,很容易出现数据溢出,需要采用我的算法否则,通过不了。
代码如下:

double f(int n,int nu){
    if(n==0) return 1;
    if(n==1) return 1;
    double p=1,i;
     double p2=1;
   
    for(i=n;i>n-nu;i--){
        p=p*i/p2;
        p2++;

    }
     //  printf("p %f ", p);
  
    return p;
}

int climbStairs(int n){
    int num2=0;
    int i,j;
    int a,b;
   long long  sum=0;
  // if(n==45) return 25;
   //if(n==44) return 25;
    if(n==1) return 1;
    num2=n/2;
    for(i=0;i<=num2;i++){
        b=n-i*2;
        a=i;
    //  printf("a  %d b  %d ", a,b);
        sum=sum+f(a+b,a);
       //   printf("sum %d ", sum);
    

    }
   //  printf("sum %d ", sum);
    
return sum;
   
}