一个正数数组分成相等的四部分分割值不算(O(n))方法

已知全是正数的数组能否将其分成4部分,使得每部分都相等(不算划分值的情况)。


  L     R

   |      |

3          5

L指向a[1],R指向a[a.length-2]

操作方式是:那一边的累加和小了,哪边的指针就动一动。


当L和R两边累加和相等的时候,就可以在L和R之间寻找划分点。

            L       R

             |        |

3,1,1,1,8 ......9,1,6


    L                 R

     |                  |

7,分1,7,分3,7,分2,7


如果存在分3使得7*2+分1=7*2+分2,那么题目要求就可以得到满足。

所以,只要此查询为O(1),那么整体的效率就是O(N)。

给一个黑盒,给两个值,一个是左边部分累加和,一个是右边部分累加和,能够返回出下标。

假设:

3 1 2 1 4 2           sum=13(先求出来)

0 1 2 3 4 5


维持一张map

("3_9",1)  代表以1(1为下标)为分界点,左边累加和是3,右边累加和是9

("4_7",2)

...

实际上不需要后边的value,因为都是正数,所以前面的key必然是没有重复的。

所以只需要做一个Set就足够用了,没有必要做一个Map

   L                  R

    |                   |

7,分1,7,分3,7,分2,7


黑盒部分:

(7+分1+7)->s1

(7+分2+7)->s2

"s1_s2"


此时,题目得到解决。

当L和R累加和相等的时候,进行查询(从Set里查询),如果查到了,则证明有;

如果不存在,继续L和R的运动,直到L==R-3的时候,就可以停止了,此时还找不到,就证明不存在。


第二种方法:

1 2 1 3 1 sum=?

记录一个Map (key,value)

其中,key代表从0,到value-1位置的累加和

          value代表当前位置(下标值)

接下来,就一个指针,不是两个指针了。

  P

   |

3 4 1 ...

假设以这个位置作为分1,能不能划分出

...分1...分2...分3...

例如 3,分1,3,分2

  3+3+分1=分2 ?判断(从map里查找)

  如果有的话:3,分1,3,分2,3,分3

  判断:3*3+分1+分2
















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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值