Leetcode 3699. Number of ZigZag Arrays I
- Leetcode 3699. Number of ZigZag Arrays I
- 1. 解题思路
- 2. 代码实现
- 题目链接:3699. Number of ZigZag Arrays I
1. 解题思路
这一题思路上就是一个动态规划。
我们定义两个长度为r−l+1r-l+1r−l+1数组u⃗\vec{u}u和d⃗\vec{d}d,分别表示当数组个数为nnn时,第一个元素为iii且下一个元素的方向为向上和向下时的取法的个数。
则易知有迭代公式:
{un+1i=∑j=i+1rdnjdn+1i=∑j=li−1unj\left\{ \begin{aligned} u_{n+1}^i &= \sum\limits_{j=i+1}^{r} d_{n}^{j} \\ d_{n+1}^i &= \sum\limits_{j=l}^{i-1} u_{n}^{j} \end{aligned} \right. ⎩⎨⎧un+1idn+1i=j=i+1∑rdnj=j=l∑i−1unj
当然,直接进行迭代的话算法复杂度将会是O(N3)O(N^3)O(N3),不过考虑到其中有两个累加操作,因此,我们可以通过累积数组的方式省略掉其中一次循环,整体的算法复杂度就是O(N2)O(N^2)O(N2)。
2. 代码实现
给出python代码实现如下:
MOD = 10**9 + 7class Solution:def zigZagArrays(self, n: int, l: int, r: int) -> int:d = r-lup, down = [1 for _ in range(d)] + [0], [0] + [1 for _ in range(d)] for i in range(n-2, -1, -1):prev_up = [0 for _ in range(d+1)]valid = 0for j in range(d-1, -1, -1):valid = (valid + down[j+1]) % MODprev_up[j] = validprev_down = [0 for _ in range(d+1)]valid = 0for j in range(1, d+1):valid = (valid + up[j-1]) % MODprev_down[j] = validup, down = prev_up, prev_downreturn (sum(up) + sum(down)) % MOD
提交代码评测得到:耗时10691ms,占用内存18.52MB。