Memoization Approach

def nth_fibonacci(A, n):
    if n == 1 or n == 2:
        return 1
    if A[n] != 0:  # Check if the sub-problem is already solved
        return A[n]
    A[n] = fib2(A, n - 1) + fib2(A, n - 2)  # Solve and store in A
    return A[n]

Bottom-Up Approach (Dynamic Programming)

def nth_fibonacci(n):
    if n <= 1:
        return n
	dp = [0] * (n + 1)
    dp[0] = 0
    dp[1] = 1
    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]
    return dp[n]