int climbStairs(int n) {
function<int(int)> ways = [&](int step) -> int {
if (step == 0) return 1;
if (step < 0) return 0;
return ways(step - 1) + ways(step - 2);
};
return ways(n);
}
public int climbStairs(int n) {
return ways(n);
}
private int ways(int step) {
if (step == 0) return 1;
if (step < 0) return 0;
return ways(step - 1) + ways(step - 2);
}
def climb_stairs(n):
def ways(step):
if step == 0: return 1
if step < 0: return 0
return ways(step - 1) + ways(step - 2)
return ways(n)
function climbStairs(n: number): number {
const ways = (step: number): number => {
if (step === 0) return 1;
if (step < 0) return 0;
return ways(step - 1) + ways(step - 2);
};
return ways(n);
}
int climbStairs(int n) {
unordered_map<int, int> memo;
function<int(int)> ways = [&](int step) -> int {
if (step <= 1) return 1;
auto known = memo.find(step);
if (known != memo.end()) return known->second;
int result = ways(step - 1) + ways(step - 2);
memo[step] = result;
return result;
};
return ways(n);
}
public int climbStairs(int n) {
Map<Integer, Integer> memo = new HashMap<>();
return ways(n, memo);
}
private int ways(int step, Map<Integer, Integer> memo) {
if (step <= 1) return 1;
Integer known = memo.get(step);
if (known != null) return known;
int result = ways(step - 1, memo) + ways(step - 2, memo);
memo.put(step, result);
return result;
}
def climb_stairs(n):
memo = {}
def ways(step):
if step <= 1: return 1
known = memo.get(step)
if known is not None: return known
result = ways(step - 1) + ways(step - 2)
memo[step] = result
return result
return ways(n)
function climbStairs(n: number): number {
const memo = new Map<number, number>();
const ways = (step: number): number => {
if (step <= 1) return 1;
const known = memo.get(step);
if (known !== undefined) return known;
const result = ways(step - 1) + ways(step - 2);
memo.set(step, result);
return result;
};
return ways(n);
}
int climbStairs(int n) {
if (n <= 1) return 1;
vector<int> dp(n + 1, 0);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
public int climbStairs(int n) {
if (n <= 1) return 1;
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
def climb_stairs(n):
if n <= 1: return 1
dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
function climbStairs(n: number): number {
if (n <= 1) return 1;
const dp = new Array<number>(n + 1).fill(0);
dp[0] = 1;
dp[1] = 1;
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
int climbStairs(int n) {
long long a = 0, b = 1;
for (int bit = 31 - __builtin_clz(n + 1); bit >= 0; bit--) {
long long c = a * (2 * b - a);
long long d = a * a + b * b;
if (((n + 1) >> bit) & 1) {
a = d;
b = c + d;
} else {
a = c;
b = d;
}
}
return (int)a;
}
public int climbStairs(int n) {
long a = 0, b = 1;
for (int bit = 31 - Integer.numberOfLeadingZeros(n + 1); bit >= 0; bit--) {
long c = a * (2 * b - a);
long d = a * a + b * b;
if ((((n + 1) >> bit) & 1) == 1) {
a = d;
b = c + d;
} else {
a = c;
b = d;
}
}
return (int) a;
}
def climb_stairs(n):
a, b = 0, 1
for bit in range((n + 1).bit_length() - 1, -1, -1):
c = a * (2 * b - a)
d = a * a + b * b
if ((n + 1) >> bit) & 1:
a = d
b = c + d
else:
a = c
b = d
return a
function climbStairs(n: number): number {
let a = 0, b = 1;
for (let bit = 31 - Math.clz32(n + 1); bit >= 0; bit--) {
const c = a * (2 * b - a);
const d = a * a + b * b;
if (((n + 1) >> bit) & 1) {
a = d;
b = c + d;
} else {
a = c;
b = d;
}
}
return a;
}