Climbing Stairs
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?
我会告诉你,我当初考研复试,面试的时候被问了这道题目了吗,当初没答出来,shit,现在看太naive了,斐波那契。
class Solution { public: int climbStairs(int n) { // Start typing your C/C++ solution below // DO NOT write int main() function if(n==0) return 0; if(n==1) return 1; if(n==2) return 2; vector<int> tmp(n); tmp[0]=1; tmp[1]=2; for(int i=2 ; i<n ; i++){ tmp[i]=tmp[i-1]+tmp[i-2]; } return tmp[n-1]; } };
几行代码搞定
当然空间复杂度可以没必要这么高了,因为斐波那契只需要记住以前的两个数而已。所以代码也可以是这样的
class Solution { public: int climbStairs(int n) { // Start typing your C/C++ solution below // DO NOT write int main() function if(n==0) return 0; if(n==1) return 1; if(n==2) return 2; int cn_2=1; int cn_1=2; int reval; for(int i=2 ; i<n ; i++){ reval=cn_2+cn_1; cn_2=cn_1; cn_1=reval; } return reval; } };