70.爬楼梯

一、题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
https://leetcode.cn/problems/climbing-stairs/

二、题解

1.代码

class Solution {
public:
    int climbStairs(int n) {
        int a[3]={1,2,3};
        if(n<=3)return a[n-1];
        else{
            a[0]=a[1];
            a[1]=a[2];
            for(int i=4;i<=n;i++){
                a[2]=a[0]+a[1];
                 a[0]=a[1];
                 a[1]=a[2];
            }
            return a[2];
        }
    }
};

2.思路

题目中主要有台阶n这个一变量在变化,故可以设置一个一维数组s[n]表示上到第n个台阶的方法。
思考:怎么得到s[n],或者说怎么爬到第n个台阶。
答案:有两种情况:

  1. 在第n-1个台阶时再上一个台阶就爬到第n个台阶。
  2. 在第n-2个台阶时再上两个台阶就爬到第n个台阶了。

所以s[n]=s[n-1]+s[n-2];

(问:当在n-2个台阶时不是有两种情况吗,①:爬两次:一次只爬一个台阶,②:爬一次:一次性爬两个台阶。)
只有一种,因为在n-2时爬一个台阶到达n-1,与第一种情况重复,故在n-2时只能一次性爬两个台阶

总结

也可用递归方式去做

int degui(int x){
	if(x>=0){
		if(x==0||x==1)return 1;
		else{
			return degui(x-1)+degui(x-2);
		} 
	}
	else return 0;	
}

但效率不高
这算是研一第一道题纪念一下,多刷题多刷题,不刷三年后会拿不到sp/ssp!!!切记切记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值