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?
3 solutions
Still can't tell difference of recursive, iterate and DP
public class Solution {
public int climbStairs(int n) {
int[] ways = new int[n+1];
ways[0] = 1;
ways[1] = 1;
if(n<0) return 0;
else if(n == 0 || n ==1) return 1;
else if(n == 2) return 2;
for(int i= 2; i<=n; i++){
ways[i] = ways[i-1]+ways[i-2];
}
return ways[n];
}
}
/
public class Solution {
public int climbStairs(int n) {
int[] map = new int[n+1];
return helper(n, map);
}
public int helper(int n, int[] map) {
if (n <= 0) return 0;
if (n == 1) return 1;
if (n == 2) return 2;
if (map[n] > 0) return map[n];
map[n] = helper(n-1, map) + helper(n-2, map);
return map[n];
}
}
//Iterative solution
public class Solution {
public int climbStairs(int n) {
int fn_1 = 2;
int fn_2 = 1;
if (n == 1) return fn_2;
if (n == 2) return fn_1;
int fn = 0;
for (int i=3; i<=n; i++) {
fn = fn_1+fn_2;
fn_2 = fn_1;
fn_1 = fn;
}
return fn;
}
}
public int climbStairs(int n) {
int[] map = new int[n+1];
return helper(n, map);
}
public int helper(int n, int[] map) {
if (n <= 0) return 0;
if (n == 1) return 1;
if (n == 2) return 2;
if (map[n] > 0) return map[n];
map[n] = helper(n-1, map) + helper(n-2, map);
return map[n];
}
}
//Iterative solution
public class Solution {
public int climbStairs(int n) {
int fn_1 = 2;
int fn_2 = 1;
if (n == 1) return fn_2;
if (n == 2) return fn_1;
int fn = 0;
for (int i=3; i<=n; i++) {
fn = fn_1+fn_2;
fn_2 = fn_1;
fn_1 = fn;
}
return fn;
}
}