题目:走10层楼梯,每步只能走1或2步
1:
将每次的进行排列组合:2的10次幂
2:
最后差一步到第10层的有几种情况?从9到10或从8到10,2种情况
这样假设0到9走法有X种,0到8走法是Y种,0到10有X+Y,因为最后一次是固定的。
问题建模:
F(10) = F(9) + F(8), 同理 F(9) = F(7) + F(8)
边界:F(1)= 1; F(2)= 2;
最优子结构,状态转移:F(n) = F(n-1) + F(n-2) (n>=3)
求解问题:
//时间复杂度O(2^n) //递归: int getclimbWays(int n){ if (n < 1) {return 0} if (n == 1) {return 1} if (n == 2) {return 2} return getclimbWays(n -1) + getclimbWays(n -2); }
1)优化时间复杂度
//建立哈希表:备忘录算法 //时间复杂度:n, 空间复杂度:n int getclimbWays(int n, HashMap<Integer, Integer> map){ if (n < 1) {return 0} if (n == 1) {return 1} if (n == 2) {return 2} if (map.contains(n)){ return map.get(n); }else{ int value = getclimbWays(n -1) + getclimbWays(n -2); map.put(n, value); return value; } }
2)优化空间复杂度,自底向上求解,只要保留2个状态
// 动态规划 int getclimbWays(int n, HashMap<Integer, Integer> map){ if (n < 1) {return 0} if (n == 1) {return 1} if (n == 2) {return 2} int a = 1; int b = 2; int temp = 0; for(int i = 3; i <= n; i++){ temp = a + b; a = b; b = temp; } return temp; }