diff --git a/java/70-Climbing-Stairs.java b/java/70-Climbing-Stairs.java new file mode 100644 index 000000000..c156179e4 --- /dev/null +++ b/java/70-Climbing-Stairs.java @@ -0,0 +1,51 @@ +//optimal +class Solution { + public int climbStairs(int n) { + int a = 1; + int b = 1; + int c; + + for (int i = 0; i < n - 1; i++) { + c = a + b; + a = b; + b = c; + } + return b; + } +} + +//bottom up +class Solution { + public int climbStairs(int n) { + int[] dp = new int[n + 1]; + dp[0] = 1; + dp[1] = 1; + + for (int i = 2; i < n + 1; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; + } +} + +//top down with memo[] +class Solution { + public int climbStairs(int n) { + int[] memo = new int[n + 1]; + Arrays.fill(memo, -1); + + return climbStairs(n - 1, memo) + climbStairs(n - 2, memo); + } + + private int climbStairs(int n, int[] memo) { + if (n < 0) return 0; + if (n == 0 || n == 1) { + memo[n] = 1; + return memo[n]; + } + if (memo[n] != -1) return memo[n]; + + memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); + return memo[n]; + } +}