递归的解法,复杂度O(n)
这里可以看到f3,f4,被计算了多次,这里可以优化,用字典先存起来,要的时候再从里面拿,不用重复计算
private Dictionary<int, int> saveResult = new Dictionary<int, int>();
public int ClimbStairs(int n)
{
if (n == 1) return 1;
if(n == 2) return 2;
//不用重复计算,每次求解的都存起来,需要的时候去字典里找,而不需要重复再计算一遍
if (saveResult.ContainsKey(n))
{
return saveResult[n];
}
else
{
int result = ClimbStairs(n - 1) + ClimbStairs(n - 2);
saveResult.Add(n, result);
return result;
}
}
非递归解法
public int ClimbStairs(int n)
{
if (n == 1) return 1;
if(n == 2) return 2;
int pre = 2;
int prePre = 1;
int result=0;
for(int i = 3; i <= n; i++)
{
result = pre + prePre;
prePre = pre;
pre = result;
}
return result;
}