Leetcode70.Climbing_Stairs

1.对于爬n个楼梯的问题,可以变成(n-1)个楼梯(先爬1阶楼梯)和(n-2)个楼梯(先爬2阶楼梯)的答案和。
即F(N)=F(N-1)+F(N-2),F(1)=1,F(2)=2,明显是斐波那契型的数列。
不断迭代便可得出结果。
时间复杂度:O(N)
C++代码:

class Solution {
public:
	int climbStairs(int n) {
		if (n <= 2) 
			return n;
		int nd1 = 2, nd2 = 1, result;
		for (int i = 3; i <= n; i++) 
		{
			result = nd1 + nd2;
			nd2 = nd1;
			nd1 = result;
		}
		return result;
	}
};

2.数学方法
对于一组N个数,其中有1个多次出现的数,重复出现k次,则这组数的全排列数为 A n n A k k \frac{A_n^n}{A_k^k} ;有2个多次出现的数,一个数重复出现 k 1 k_1 次,另一个数重复出现 k 2 k_2 次,这组数的全排列数为 A n n A k 1 k 1 A k 2 k 2 \frac{A_n^n} {A_{k_1}^{k_1}*A_{k_2}^{k_2}}
爬楼梯问题实质上是[n/2]组([]代表向下取整)有 k 1 = n 2 i k_1=n-2*i 个‘1’和 k 2 = i k_2=i 个‘2’且 k 1 + 2 k 2 = n k_1+2k_2=n 的数组全排列数的加和。
i = 0 i &lt; = [ n / 2 ] A k 1 + k 2 k 1 + k 2 A k 1 k 1 A k 2 k 2 \sum_{i=0}^{i&lt;=[n/2]}{\frac{A_{k_1+k_2}^{k_1+k_2}}{A_{k_1}^{k_1}*A_{k_2}^{k_2}}}
这个时间复杂度比上一个要差,仅仅是提供思路。
C++代码:

class Solution {
public:
	int climbStairs(int n) {
		if (n == 0)
			return 0;
		if (n == 1)
			return 1;
		if (n == 2)
			return 2;
		int result = 1;
		for (int i = 1; i <= n / 2; i++)
		{
			int odd = n - 2 * i;
			int even = i;
			long long permute = 1;
			int min = std::min(even, odd);
			for (int j = odd + even; j > max(even, odd); j--)
			{
				if (min > 1 && permute / min * min == permute)
				{
					permute /= min;
					min--;
				}
				permute *= j;
			}
			while (min > 1)
			{
				permute /= min;
				min--;
			}
			result += permute;
		}
		return result;
	}
};

猜你喜欢

转载自blog.csdn.net/qq_42263831/article/details/82814493