分割数组

来源:互联网 发布:每股收益的算法 编辑:程序博客网 时间:2024/06/05 21:11

已知一个全是整数的数组,返回是否能将该数组分成4部分,每一部分累加和相等,分割之不算。
方法一:
设置一个黑盒,存放的是i下标坐标的和加“_”加右边的和

#coding=utf-8def solution(nums):    if len(nums)<7:        return False    allSum=sum(nums)    d={}    leftSum=nums[0]    for i in range(1,len(nums)-1):        d[i]=str(leftSum)+"_"+str(allSum-nums[i]-leftSum)        leftSum+=nums[i]    print d    print d.values()    l=1    lsum=nums[0]    r=len(nums)-2    rsum=nums[-1]    while l<r-3:        if lsum==rsum:            if str(lsum*2+nums[l])+'_'+str(rsum*2+nums[r]) in d.values():                return True        elif lsum<rsum:            lsum+=nums[l]            l+=1        else:            rsum+=nums[r]            r-=1    return False

方法二:
因为全是正数,可以统计当前下标之前的数字和。然后遍历数组,先找第二个分割点,再找第三个。

def solution2(nums):    if len(nums)<7:        return False    d={}    s=nums[0]    for i in range(1,len(nums)):        d[s]=i        s+=nums[i]    lsum=nums[0]    for i in range(1,len(nums)-5):        checkSum=lsum*2+nums[i]        if checkSum in d.keys():            j=d[checkSum]            checkSum+=lsum+nums[j]            if checkSum in d.keys():                k=d[checkSum]                if checkSum+nums[k]+lsum==s:                    return True        lsum+=nums[i]    return False