3524.求出数组的 X 值 I:动态规划(扫表法)
【LetMeFly】3524.求出数组的 X 值 I:动态规划(扫表法)
力扣题目链接:https://leetcode.cn/problems/find-x-value-of-array-i/
给你一个由 正 整数组成的数组 nums,以及一个 正 整数 k。
你可以对 nums 执行 一次 操作,该操作中可以移除任意 不重叠 的前缀和后缀,使得 nums 仍然 非空 。
你需要找出 nums 的 x 值,即在执行操作后,剩余元素的 乘积 除以 k 后的 余数 为 x 的操作数量。
返回一个大小为 k 的数组 result,其中 result[x] 表示对于 0 <= x <= k - 1,nums 的 x 值。
数组的 前缀 指从数组起始位置开始到数组中任意位置的一段连续子数组。
数组的 后缀 是指从数组中任意位置开始到数组末尾的一段连续子数组。
子数组 是数组中一段连续的元素序列。
注意,在操作中选择的前缀和后缀可以是 空的 。
示例 1:
输入: nums = [1,2,3,4,5], k = 3
输出: [9,2,4]
解释:
- 对于
x = 0,可行的操作包括所有不会移除nums[2] == 3的前后缀移除方式。 - 对于
x = 1,可行操作包括:- 移除空前缀和后缀
[2, 3, 4, 5],nums变为[1]。 - 移除前缀
[1, 2, 3]和后缀[5],nums变为[4]。
- 移除空前缀和后缀
- 对于
x = 2,可行操作包括:- 移除空前缀和后缀
[3, 4, 5],nums变为[1, 2]。 - 移除前缀
[1]和后缀[3, 4, 5],nums变为[2]。 - 移除前缀
[1, 2, 3]和空后缀,nums变为[4, 5]。 - 移除前缀
[1, 2, 3, 4]和空后缀,nums变为[5]。
- 移除空前缀和后缀
示例 2:
输入: nums = [1,2,4,8,16,32], k = 4
输出: [18,1,2,0]
解释:
- 对于
x = 0,唯一 不 得到x = 0的操作有:<ul> <li>移除空前缀和后缀 <code>[4, 8, 16, 32]</code>,<code>nums</code> 变为 <code>[1, 2]</code>。</li> <li>移除空前缀和后缀 <code>[2, 4, 8, 16, 32]</code>,<code>nums</code> 变为 <code>[1]</code>。</li> <li>移除前缀 <code>[1]</code> 和后缀 <code>[4, 8, 16, 32]</code>,<code>nums</code> 变为 <code>[2]</code>。</li> </ul> </li> <li>对于 <code>x = 1</code>,唯一的操作是: <ul> <li>移除空前缀和后缀 <code>[2, 4, 8, 16, 32]</code>,<code>nums</code> 变为 <code>[1]</code>。</li> </ul> </li> <li>对于 <code>x = 2</code>,可行操作包括: <ul> <li>移除空前缀和后缀 <code>[4, 8, 16, 32]</code>,<code>nums</code> 变为 <code>[1, 2]</code>。</li> <li>移除前缀 <code>[1]</code> 和后缀 <code>[4, 8, 16, 32]</code>,<code>nums</code> 变为 <code>[2]</code>。</li> </ul> </li> <li>对于 <code>x = 3</code>,没有可行的操作。</li>
示例 3:
输入: nums = [1,1,2,1,1], k = 2
输出: [9,6]
提示:
1 <= nums[i] <= 1091 <= nums.length <= 1051 <= k <= 5
解题方法:动态规划
从左到右遍历一遍数组,令$dp[i]$表示以当前元素结尾的子数组中乘积模$k$等于$i$的个数。
假设上一个元素结尾的子数组情况是$dp$当前元素结尾的子数组情况是$dp2$,则对于上次乘积取模结果为$i$的所有子数组,乘以当前元素$t$后总乘积取模结果为$it%k$,因此有$dp2[it%k]+=dp[i]$。
此外,当前元素本身也可以作为一个子数组,记得$dp2[t%k] += 1$。
为何称之为扫表法,因为是由前面的$dp[i]$来确定现在的$dp2[f(i)]$,而不是为了确定现在的$dp2[i]$去找前面的$dp[x]$。
答案即为以每个元素为结尾的$dp[i]$的累加。
- 时间复杂度$O(len(nums) * k)$
- 空间复杂度$O(k)$
AC代码
C++
1 | |
Python
1 | |
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源