मान लीजिए हमारे पास पूर्णांकों का एक ऐरे A है। हमें sum के सभी मान ढूंढने हैं ताकि किसी मान sum[i] के लिए ऐरे को उप-सरणियों में विभाजित किया जा सके जिनमें से प्रत्येक का योग sum[i] हो। यदि हम ऐरे को समान योग की उप-सरणियों में विभाजित नहीं कर सकते, तो -1 लौटाएं।
इसलिए, यदि इनपुट A = [2, 4, 2, 2, 2, 4, 2, 6] है, तो आउटपुट [6, 8, 12] होगा क्योंकि ऐरे को योग 6, 8 और 12 की उप-सरणियों में विभाजित किया जा सकता है। ये इस प्रकार हैं:
[{2, 4}, {2, 2, 2}, {4, 2}, {6}][{2, 4, 2}, {2, 2, 4}, {2, 6}][{2, 4, 2, 2, 2}, {4, 2, 6}]
समाधान दृष्टिकोण
इसे हल करने के लिए हम निम्न चरणों का पालन करेंगे:
n := len(a)table := [0] * ntable[0] := a[0]iको 1 सेn-1तक:table[i] := a[i] + table[i-1]S := table[n-1](कुल योग)my_map := {}iको 0 सेn-1तक:my_map[table[i]] := 1answer := set()iको 1 सेint(sqrt(S)) + 1तक के लिए:- यदि
S % i == 0:is_present := Truepart_1 := ipart_2 := S // ijकोpart_1सेSतकpart_1चरण में:- यदि
j not in my_map, तोis_present := False, ब्रेक करें।
- यदि
- यदि
is_presentऔरpart_1 != S, तोanswer.add(part_1) is_present := TruejकोS // iसेSतकS // iचरण में:- यदि
j not in my_map, तोis_present := False, ब्रेक करें।
- यदि
- यदि
is_presentऔरpart_2 != S, तोanswer.add(part_2)
- यदि
- यदि
len(answer) == 0, तो -1 लौटाएं। answerलौटाएं।
उदाहरण
बेहतर समझ के लिए निम्न कार्यान्वयन देखें:
from math import sqrt
def find_sum(a):
n = len(a)
table = [0] * n
table[0] = a[0]
for i in range(1, n):
table[i] = a[i] + table[i - 1]
S = table[n - 1]
my_map = {}
for i in range(n):
my_map[table[i]] = 1
answer = set()
for i in range(1, int(sqrt(S)) + 1):
if S % i == 0:
is_present = True
part_1 = i
part_2 = S // i
for j in range(part_1, S + 1, part_1):
if j not in my_map:
is_present = False
break
if is_present and part_1 != S:
answer.add(part_1)
is_present = True
for j in range(S // i, S + 1, S // i):
if j not in my_map:
is_present = False
break
if is_present and part_2 != S:
answer.add(part_2)
if len(answer) == 0:
return -1
return answer
a = [2, 4, 2, 2, 2, 4, 2, 6]
print(find_sum(a))
इनपुट
[2, 4, 2, 2, 2, 4, 2, 6]
आउटपुट
{8, 12, 6}