📅  最后修改于: 2023-12-03 15:09:37.148000             🧑  作者: Mango
本题目要求将一个非空且仅由正整数构成的数组拆分为两个子数组,且这两个子数组的乘积相等。我们需要找出最小的索引,即使得两个子数组的乘积相等。如果不存在这样的索引,返回 -1
。
可以使用前缀积来解决这个问题。我们首先计算出每个位置上的前缀积,然后从左到右枚举每个位置,将它作为分割点,判断左右两个子数组的乘积是否相等。
具体地,我们可以计算出每个位置的前缀积之和 prefix_sum
,以及数组的总乘积 prod
。然后从左到右枚举每个位置 i
,判断 prefix_sum[i-1]
和 prod / prefix_sum[i]
是否相等。如果相等,则说明找到了答案,返回 i-1
。如果遍历完整个数组还没有找到答案,则说明不存在这样的索引,返回 -1
。
以下是 Python 代码实现:
from typing import List
def find_min_index(nums: List[int]) -> int:
n = len(nums)
prefix_sum = [1] * n
prod = 1
for i in range(n):
prod *= nums[i]
prefix_sum[i] = prod
for i in range(1, n):
left_sum = prefix_sum[i-1]
right_sum = prod // prefix_sum[i]
if left_sum == right_sum:
return i-1
return -1
时间复杂度:$O(n)$,其中 $n$ 是输入数组的长度。
空间复杂度:$O(n)$,需要用 $O(n)$ 的空间存储前缀积。