Cracking Coding Interview - 8.1 Triple Step

Triple Step: A child is running up a staircase with n steps and can hop either 1 step, 2 steps, or 3 steps at a time. Implement a method to count how many possible ways the child can run up the stairs.

Hints: #152, #178, #217, #237, #262, #359.

解法1

如果第一次要走1个台阶,那么就只有一种走法(1),剩余n - 1个台阶要走。

如果第一次要走2个台阶,那么有两种走法(1)、(2),剩余n - 2个台阶要走。

如果第一次要走3个台阶,那么有4种走法(1,1,1)、(1,2)、(2,1)、(3),剩余n - 4个台阶要走。

1
2
f(n) = f(n - 1) + f(2) * f(n - 2) + f(3) * f(n - 3)
     = f(n - 1) +    2 * f(n - 2) +    4 * f(n - 3)

代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public int tripleStep(int n) {
  if (n == 1 || n == 2) {
    return n;
  }
  if (n == 3) {
    return 4;
  }
  int count = 0;
  if (n - 1 > 0) {
    count += tripleStep(n - 1);
  }
  if (n - 2 > 0) {
    count += 2 * tripleStep(n - 2);
  }
  if (n - 3 > 0) {
    count += 4 * tripleStep(n - 3);
  }
  return count;
}

时间复杂度:O(3n)

解法2

解法1存在重复计算,弄一个缓存:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int tripleStep(int n, int[] cache) {
  if (n == 1 || n == 2) {
    return n;
  }
  if (n == 3) {
    return 4;
  }
  if (cache[n] != 0) {
    return cache[n];
  }
  int count = 0;
  if (n - 1 > 0) {
    count += tripleStep(n - 1);
  }
  if (n - 2 > 0) {
    count += 2 * tripleStep(n - 2);
  }
  if (n - 3 > 0) {
    count += 4 * tripleStep(n - 3);
  }
  cache[n] = count;
  return count;
}

时间复杂度:O(n)

空间复杂度:O(n)

版权

评论