题目:
给定一个大小为N的数组。查找一个元素,可以将数组分成两个等积的子数组。 如果没有这样的元素,则打印-1。
比如:
输入 : 1 4 2 1 4
输出 : 2
以2为分割元素,
子数组 : {1, 4} 以及 {1, 4}
1*4 = 1*4
输入 : 2, 3, 4, 1, 4, 6
输出 : 1
以1为分割元素,
子数组 : {2, 3, 4} 以及 {4, 6}
2*3*4 = 4*6
分析:
一个简单的思路是从第二个元素开始的进行遍历。 计算左侧元素和右侧元素的乘积。 如果这两个产品相同,则返回元素。
时间复杂度:O(N^2)
解题:
更好的解决方案是使用前缀和后缀数组。 用left[i]表示 a[0]a[1]...a[i-1]的乘积,right[i]同理表示a[i+1]a[i+2]...a[N-1]的乘积。
遍历一次数组可以建立 left[0..N-1],再遍历一次建立right[0 ... N-1]
再需要一次遍历找出 left[i] == right[i]
时间复杂度:O(N)
辅助空间:O(N)
代码:
略
辅助空间可以优化到O(1) 留给读者思考。