You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
时间复杂度为O(n)
时间复杂度为O(n)
- state: f[i] 表示爬到第i个楼梯的所有方法的和
- function: f[i] = f[i-1] + f[i-2] //因为每次走一步或者两步, 所以f[i]的方法就是它一步前和两步前方法加和
- initial: f[0] = 0; f[1] = 1; f[2] = 2
- end : return f[n]
public class Solution { /** * @param n: An integer * @return: An integer */ public int climbStairs(int n) { if (n == 0 || n == 1 || n == 2){ return n; } int [] sum = new int [n + 1]; sum[1] = 1; sum[2] = 2; for (int i =3; i <= n; i++) { sum[i] = sum[i-1] + sum[i-2]; } return sum[n]; } } //O(1) 空间方法 public class Solution { public int climbStairs(int n) { if (n == 0 || n == 1 || n == 2){ return n; } int [] sum = new int [3]; sum[1] = 1; sum[2] = 2; for (int i =3; i <= n; i++) { sum[i%3] = sum[(i-1)%3] + sum[(i-2)%3]; } return sum[n%3]; } }
没有评论:
发表评论