[leetcode] #70 Climbing Stairs

来源:互联网 发布:linux强制删除目录 编辑:程序博客网 时间:2024/05/20 06:23

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

题目大概意思是有n级台阶,每次可以爬2级或者1级,问总共有几种爬法。

刚开始以为是很简单的排列组合计算,于是直接码出了v1:

int climbStairs(int n) {    int NumOfTwo=0;    int NumOfOne=0;    int NumOfWay=0;    int Sum;    int Pro;       for (NumOfTwo=0;NumOfTwo<=n/2;NumOfTwo++)    {        Pro=1;        NumOfOne=n-NumOfTwo*2;        Sum=NumOfOne+NumOfTwo;        for (int i=Sum;i>NumOfTwo;i--)            Pro*=i;        for (int j=1;j<=NumOfOne;j++)            Pro/=j;        NumOfWay+=Pro;    }    return NumOfWay;}

跑出了果然出错了,原因是溢出,阶乘嘛,大家都懂的。

于是想把乘法和除法同时做(这时乘法得从大做,除法从小做,不然两个int没法约,直接变1),还暴力的上了long long int来存储,倒是leetcode上的测试过了,但是问题还是没解决,仍然很容易出现溢出。

int climbStairs(int n) {        int NumOfTwo=0;    int NumOfOne=0;    int NumOfWay=0;    int Sum;    long long int Pro=1;       for (NumOfTwo=0;NumOfTwo<=n/2;NumOfTwo++)    {        Pro=1;        NumOfOne=n-NumOfTwo*2;        Sum=NumOfOne+NumOfTwo;        for (int i=Sum,j=1;i>NumOfTwo&&j<=NumOfOne;i--,j++)        {            Pro*=i;            Pro/=j;        }        NumOfWay+=Pro;    }    return NumOfWay;}

速度倒是不满,1ms出,但作为一个为当程序员而刷leetcode的人,总是觉得这种鲁棒性(这里又想起了张灏老师:“人家原先叫稳健性,多好听的名字,不知道被谁叫成了鲁棒性”。)差的程序很不舒服。仔细考虑了一下,还可以用动态规划来做:站在每一级台阶上,它能到达的路线数等于它的前两级台阶的到达路线数的总和(也就是斐波那契数列)。然后就有了下面的码:

int climbStairs(int n) {        int one=1,two=1;    int temp;        for (int i=1;i<n;i++)    {        temp=two;        two+=one;        one=temp;    }    return two;}


0 0
原创粉丝点击