You are given two positive integers startPos
and endPos
. Initially, you are standing at position startPos
on an infinite number line. With one step, you can move either one position to the left, or one position to the right.
Given a positive integer k
, return the number of different ways to reach the position endPos
starting from startPos
, such that you perform exactly k
steps. Since the answer may be very large, return it modulo 109 + 7
.
Two ways are considered different if the order of the steps made is not exactly the same.
Note that the number line includes negative integers.
Example 1:
Input: startPos = 1, endPos = 2, k = 3 Output: 3 Explanation: We can reach position 2 from 1 in exactly 3 steps in three ways: - 1 -> 2 -> 3 -> 2. - 1 -> 2 -> 1 -> 2. - 1 -> 0 -> 1 -> 2. It can be proven that no other way is possible, so we return 3.
Example 2:
Input: startPos = 2, endPos = 5, k = 10 Output: 0 Explanation: It is impossible to reach position 5 from position 2 in exactly 10 steps.
Constraints:
1 <= startPos, endPos, k <= 1000
class Solution:
def numberOfWays(self, startPos: int, endPos: int, k: int) -> int:
@cache
def dfs(i: int, j: int) -> int:
if i > j or j < 0:
return 0
if j == 0:
return 1 if i == 0 else 0
return (dfs(i + 1, j - 1) + dfs(abs(i - 1), j - 1)) % mod
mod = 10**9 + 7
return dfs(abs(startPos - endPos), k)
class Solution {
private Integer[][] f;
private final int mod = (int) 1e9 + 7;
public int numberOfWays(int startPos, int endPos, int k) {
f = new Integer[k + 1][k + 1];
return dfs(Math.abs(startPos - endPos), k);
}
private int dfs(int i, int j) {
if (i > j || j < 0) {
return 0;
}
if (j == 0) {
return i == 0 ? 1 : 0;
}
if (f[i][j] != null) {
return f[i][j];
}
int ans = dfs(i + 1, j - 1) + dfs(Math.abs(i - 1), j - 1);
ans %= mod;
return f[i][j] = ans;
}
}
class Solution {
public:
int numberOfWays(int startPos, int endPos, int k) {
const int mod = 1e9 + 7;
int f[k + 1][k + 1];
memset(f, -1, sizeof(f));
function<int(int, int)> dfs = [&](int i, int j) -> int {
if (i > j || j < 0) {
return 0;
}
if (j == 0) {
return i == 0 ? 1 : 0;
}
if (f[i][j] != -1) {
return f[i][j];
}
f[i][j] = (dfs(i + 1, j - 1) + dfs(abs(i - 1), j - 1)) % mod;
return f[i][j];
};
return dfs(abs(startPos - endPos), k);
}
};
func numberOfWays(startPos int, endPos int, k int) int {
const mod = 1e9 + 7
f := make([][]int, k+1)
for i := range f {
f[i] = make([]int, k+1)
for j := range f[i] {
f[i][j] = -1
}
}
var dfs func(i, j int) int
dfs = func(i, j int) int {
if i > j || j < 0 {
return 0
}
if j == 0 {
if i == 0 {
return 1
}
return 0
}
if f[i][j] != -1 {
return f[i][j]
}
f[i][j] = (dfs(i+1, j-1) + dfs(abs(i-1), j-1)) % mod
return f[i][j]
}
return dfs(abs(startPos-endPos), k)
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
function numberOfWays(startPos: number, endPos: number, k: number): number {
const mod = 10 ** 9 + 7;
const f = new Array(k + 1).fill(0).map(() => new Array(k + 1).fill(-1));
const dfs = (i: number, j: number): number => {
if (i > j || j < 0) {
return 0;
}
if (j === 0) {
return i === 0 ? 1 : 0;
}
if (f[i][j] !== -1) {
return f[i][j];
}
f[i][j] = dfs(i + 1, j - 1) + dfs(Math.abs(i - 1), j - 1);
f[i][j] %= mod;
return f[i][j];
};
return dfs(Math.abs(startPos - endPos), k);
}