日期:2026年9月21日
LeetCode 題目連結:3524. Find X Value of Array I
解題想法
中等難度題,題目正整數陣列 $nums$、一個正整數 $k$,可以移 $nums$ 之中移除不重疊的前綴子陣列及後綴子陣列,使 $nums$ 乘下的元素積乘對 $k$ 取餘數,計算得到各種餘數有幾種方法數。題目下方有提示:
- 用動態規畫解題。
- 定義 $dp[i][r]$ 為以索引值 $i$ 為結尾的元素乘積,對 $k$ 取餘數為 $r$ 的方法數。
- 將每一個索引值的 $dp[i][r]$ 加起來,計算答案 $ans[r]$。
Python 程式碼
Runtime: 435 ms, beats 26.32%. Memory: 46.36 MB, beats 19.74%.
class Solution:
def resultArray(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
# dp[i][j] 代表以索引值 i-1 結尾,其元素乘積除以 k 餘數為 j 的子陣列數量
dp = [[0]*k for _ in range(n+1)]
ans = [0]*k # 答案
for i in range(1, n+1):
# nums[i-1] 為長度 1 的子陣列
rem = nums[i-1] % k
dp[i][rem] = 1
# 內層迴圈,跑 j = 0 ~ k-1,將目前的數字接在前一個結尾的子陣列之後
for j in range(k):
if dp[i-1][j] > 0: # 如果有前一個結尾對應的子陣列數量
new_rem = (j * rem) % k
dp[i][new_rem] += dp[i-1][j]
# 將這一回産生的答案都加到 ans
for j in range(k):
ans[j] += dp[i][j]
# 回傳答案
return ans