python数组分成两个和相等的子集_[面试]找到一个元素,可以将数组分成两个乘积相等的子数组...

题目:

给定一个大小为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) 留给读者思考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值