หา Sum ทั้งหมดที่ทำให้อาร์เรย์แบ่งเป็น Subarray ผลรวมเท่ากันได้
กำหนดอาร์เรย์ A ต้องการหาค่า sum ทั้งหมดที่ทำให้สามารถแบ่ง A เป็น Subarray ต่อเนื่องหลายๆ ตัวที่ทุกตัวมีผลรวมเท่ากับ sum นั้นได้
ตัวอย่าง: A = [2,4,2,2,2,4,2,6] → ผลลัพธ์ [6, 8, 12]
แนวคิด
- คำนวณ Prefix Sum ทั้งอาร์เรย์
- ผลรวมทั้งหมด
Sต้องหารด้วยsumลงตัว - สำหรับแต่ละตัวหาร
dของSตรวจสอบว่ามี Prefix Sum ครบทุกคูณของd(คือd, 2d, 3d, ..., S) หรือไม่ - ถ้ามีครบ →
dเป็นคำตอบที่ถูกต้อง
โค้ดตัวอย่าง Python
from math import sqrt
def find_sum(a):
n = len(a)
prefix = [0] * n
prefix[0] = a[0]
for i in range(1, n):
prefix[i] = prefix[i-1] + a[i]
S = prefix[-1]
prefix_set = set(prefix)
ans = set()
for d in range(1, int(sqrt(S)) + 1):
if S % d == 0:
# check divisor d
ok = all(k in prefix_set for k in range(d, S+1, d))
if ok and d != S:
ans.add(d)
# check paired divisor S//d
d2 = S // d
ok = all(k in prefix_set for k in range(d2, S+1, d2))
if ok and d2 != S:
ans.add(d2)
return sorted(ans) if ans else -1
print(find_sum([2,4,2,2,2,4,2,6])) # [6, 8, 12]