# https://leetcode.com/problems/climbing-stairs/
# 70. Climbing Stairs
# 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?
# Note: Given n will be a positive integer.
# Example 1:
# Input: 2
# Output: 2
# Explanation: There are two ways to climb to the top.
# 1. 1 step + 1 step
# 2. 2 steps
# Example 2:
# Input: 3
# Output: 3
# Explanation: There are three ways to climb to the top.
# 1. 1 step + 1 step + 1 step
# 2. 1 step + 2 steps
# 3. 2 steps + 1 step

# Recursive with memoization
def climbStairs(n):
    memo = {}
    def _climb(n, memo):
        if n < 1:
            return 0
        if n == 1:
            return 1
        if n == 2:
            return 2
        if n in memo:
            return memo[n]
        else:
            memo[n] = _climb(n-1, memo) + _climb(n-2, memo)
        return memo[n]
    _climb(n, memo)

# Iterative
def climbStairs(n):
    prev, curr = 0, 1
    for _ in range(n):
        prev, curr = curr, prev + curr
    return current
