已知全是正数的数组能否将其分成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