Leetcode 题目整理 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?

Note: Given n will be a positive integer.

对这种题目开始没有什么思路,借鉴博客http://blog.csdn.net/kenden23/article/details/17377869 给出的递归的思想。每次有两种选择,两种选择之后又是各有两种选择,如此循环,正好是递归求解的问题。

 

int Solution::climbStairs(int n) {
	//直接进行递归
	if (n == 1) return 1;
	if (n == 2) return 2;
	return climbStairs(n - 1) + climbStairs(n - 2);
}

 

但直接进行递归在leetcode 上的测试没有通过,给的理由是Time Limit Exceeded

尝试博客中的第二种方法:

共有1级的时候有1种可能,n=1时 res[1]=1;

共有2级的时候有2种可能,n=2时res[2]=2;

共有3级的时候等于最后一步走了1级的可能结果res(2) 加上最后一步走了两级的可能结果res(1) ,即 n=3时res[3]=res(2)+res(1);

所以有循环 res[n]=res(n-1)+res(n-2);

 

int Solution::climbStairs(int n) {
	
	//利用递归和循环的转换
	if (n == 1) return 1;
	if (n == 2) return 2;
	vector<int> res;
	res.push_back(1);
	res.push_back(2);
	for (int i = 2; i < n ; i++)
	{
		res.push_back(res.at(i - 1) + res.at(i - 2));
	}	
	return res.back();// .at(n - 1);
}

 

通过了,在博客中还指出了使用空间问题,确实,在代码执行的过程中只用到最后三个,而且最终的输出也只是最后一个,所以空间完全可以重复利用。

 

posted @ 2017-05-04 15:32  司马_羽鹤  阅读(164)  评论(0编辑  收藏  举报