国内某著名IT公司编程测验: 以数组内的三个下标四等分一个数组

本文介绍了如何解决一个编程测验问题:判断整数数组是否能通过三个下标进行四等分,使得四部分的和相等。讨论了一种PHP实现方法,虽然其复杂度为O(M*N),但提出了动态规划的思路作为解决O(N)复杂度问题的探讨方向。
摘要由CSDN通过智能技术生成

国内某著名IT公司编程测验: 以数组内的三个下标四等分一个数组

论坛原贴>
http://bbs.csdn.net/topics/392114261
刚刚参加了国内某著名IT公司的编程测验,感觉有点怀疑人生了
题目如下:写一个函数,输入是一个整数数组,输出是一个布尔值,判断这个整数数组能不能四等分。什么是四等分呢?简单说,就是在这个数组里面找到三个下标,这三个下标对应的数把数组分成四个部分,这四个部分和是相等的,那么这个数组就是可以四等分的。例如:1,1,1,2,0,2,5,-1,3,找到三个下标2,4,6分成的四个部分是{1,1},{2},{2},{-1,3},这四个部分和都是2,所以这个数组是可以四等分的,暂且认为如果四个部分有一个部分是空的话和就是0,比如可以认为{1,1,1}这个数组可以四等分(这一个要求我记得不是很清楚了,其实不是很重要)。
数组长度十万以内,数组里的每个数范围正负十万之间,要求:时间复杂度O(N)以内,空间复杂度O(N)以内,N是数组长度

首先说明:如果按照题目的要求,四等分不能包括边界下标的话,这是一道动态规划的算法题,而且需要考虑比较多的因素,因为每段区间的和是不能通过总和来计算的,必须通过不断的动态规划,才能找出或不能找出这个“四等分”值来。本人才疏学浅,不知道怎样才能将动态规划问题的复杂度变为O(N)。

以下是用php实现的方法:复杂度O(M*N)
首先来讲讲思路:比如有如下满足条件的数组$arr =[1,3,1,3,1,3,1,3,4,4],长度为10,默认数组两头之外为0,首先我们把这个数组分成3份(左边,中间,右边),其中,左边 = 右边,比如这样[0], 1, [3,1,3,1,3,1,3,4,],4, [0] 又或者是这样[1,3] ,1,[3,1,3,1,3],4,[4],加粗的数字是从数组抽离的隔离点,是不纳入区间求和范围的,这点要注意。我们分成左中右后呢,接下来就是把中间那部分也分成两部分,比如以上的例子,可以是
[0], 1, [3,1],3,[1,3,]1,[3,4,],4, [0] ,
也可以是这样的:
[1,3] ,1,[3,1,],3,[1,3],4,[4]。其中只有后者才能满足条件。废话不多,首先我们来写一个分割中间那部分的方法,如以下的
div2Pairs(),首先我们得把中间这一段攫取下来,传入左右两个分界点,两个分解点往中间挤一挤,比如上面的
1,[3,1,3,1,3],4 ,挤掉分解点后,就只剩下[3,1,3,1,3]。现在要把[3,1,3,1,3]分成两等份(如果可以等份),因为我们必须保留一个分解点,所以不能通过求总和折半的方式,为了保证尽可能的分成两等份,我们可以分别从两头开始,假设从左边开始的和为 lsum rsum ,那么我们应该确保每一步操作中总有| lsum rsum|是最

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值