题解采用了动态规划的方法。定义一个 dp 数组,其中 dp[j] 表示在当前步数下,指针位于位置 j 的方案数。由于指针每一步可以向左、向右移动或停在原地,因此状态转移方程为 dp_new[j] = (dp[j-1] + dp[j] + dp[j+1]) % 1000000007。此外,由于指针不能超出数组长度或数组起始位置,数组长度可以通过 min(steps//2+2, arrLen) 进行优化,这是因为指针最远只能走到最远的距离,再走回来,而这个距离大约是 steps 的一半。最后,根据步数的奇偶性,计算最终停在原点的方案数。
时间复杂度: O(steps * min(steps/2+1, arrLen))
空间复杂度: O(min(steps/2+2, arrLen))
class Solution:
def numWays(self, steps: int, arrLen: int) -> int:
arrLen = min(steps//2 + 2, arrLen) # 优化数组长度
if arrLen == 1:
return 1 # 只有一个位置时,唯一方案就是不动
dp = [0] * (arrLen + 2)
dp_new = [0] * (arrLen + 2)
dp_new[2] = 1
dp_new[1] = 1 # 初始化起始位置的方案
# 进行动态规划更新
for i in range((steps - 1) // 2):
dp, dp_new = dp_new, dp # 交换数组,准备下一轮计算
for j in range(1, arrLen + 1):
dp_new[j] = (dp[j - 1] + dp[j] + dp[j + 1]) % 1000000007 # 更新状态
if steps % 2:
ans = 0
for j in range(1, arrLen + 1):
ans += dp_new[j] * dp[j] # 奇数步,计算最终方案数
else:
ans = 0
for j in range(1, arrLen + 1):
ans += dp_new[j] * dp_new[j] # 偶数步,计算最终方案数
return ans % 1000000007 # 返回结果