题目
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?
Note: Given n will be a positive integer.
思路
由于每次只能走1或者2,所以首先能确定总共走的次数i的范围为n/2(上取整)到n;
针对每一种次数i,实际上就确定了走1步的次数和走2步的次数,那么就是一个组合数确定i次走的时候总共的走法;
将所有i次的走法加起来即可得到结果
代码
public class Solution {
public long comb(long n , long x){
long result = 1l;
if(x >= n || x == 0) return result;
if(n-x < x) x = n-x;
result = result * n;
for(int i = 1 ; i < x ; ++ i ){
if(result % (i +1) == 0) result = result / (i + 1) * (n - i);
else result = result * (n - i) / (i + 1);
}
return result;
}
//楼梯走法
public int climbStairs(int n) {
int a = n / 2;
if(n % 2 == 1) a = a + 1;
int b = n;
int result = 0;
//i为走的次数
for(int i = a ; i <= b ; ++ i){
int count = n - i;//2的次数
result = (int) (result + comb(i , count));
System.out.println(i+"--"+count+"--"+result);
}
return result;
}
}