LeetCode70.爬楼梯(C++实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28584889/article/details/83824447

LeetCode70.爬楼梯的题目如下:

方法一:直接递归实现(超时)

刚开始直接用递归实现,思路也是比较直接的,如下图,当n = 5的时候,有8种方法。

实现代码如下:

void selectStair(int remainStep, int &count)
{
	if(remainStep == 0)
	{ //当剩余步数为0,说明找到一种方法,计数加一
		count++;
		return;
	}
	if(remainStep >= 2) //当剩余台阶大于等于2时,有选择余地
	{
		selectStair(remainStep - 1, count);//走一阶
		selectStair(remainStep - 2, count);//走两阶
	}else if(remainStep == 1){
		selectStair(remainStep - 1, count); //当剩余台阶等于1,没有选择余地,只能走一阶
	}
}

//使用递归,超出时间限制
int climbStairs_recur(int n) {
	int count = 0, remainStep = n;
	selectStair(remainStep, count);
	return count;
}

但是这种递归实现的方法,当n很大的时候,递归的栈很深,耗时贼长,当n = 44的时候,就运行了很久才出来结果,在LeetCode上提交是超时的。很无奈,于是想了下面的办法。

方法二:进阶①——递归实现斐波那契数列(超时)

正苦于无奈,突然发现每个n对应的走法F(n)好像存在什么规律,如下:

n   F(n)
1 -> 1
2 -> 2
3 -> 3
4 -> 5
5 -> 8
6 -> 13
7 -> 21
8 -> 34
9 -> 55
10 -> 89

看着似曾相识,咦~这不就是斐波那契数列嘛! F(n) = F(n - 1) + F(n - 2)

但是刚开始想斐波那契数列还是用递归实现,以为不用耗时太久,结果还是对递归的认识不够深刻,上递归代码:

//规律-斐波那契数列-用递归实现(超时)
int F(int n)
{
	if(n == 1)
		return 1;
	if (n == 2)
		return 2;
	if(n > 2)
		return F(n - 1) + F(n - 2);
}

int climbStairs_F(int n) {
	return F(n);
}

结果发现,跟方法一也差不了多少。。。无奈!

幸好,实现斐波那契数列数列不一定非得用递归啊!咱用数组照样实现斐波那契数列。

方法三:进阶②——数组实现斐波那契数列(完美解决)

直接上代码:

//利用数组实现斐波那契数列
int climbStairs(int n) {
	vector<int> s;
	s.push_back(1);
	s.push_back(2);//先把头两个元素放进数组
	if (n == 1)
		return 1;
	if(n == 2)
		return 2;
	for (int i = 2; i < n; i++)
	{
		s.push_back(s[i - 1] + s[i - 2]); //用数组存储的方法去找F(n)
	}
	return s[n - 1];
}

最后的结果也是很棒的:

猜你喜欢

转载自blog.csdn.net/qq_28584889/article/details/83824447