Я прочитал о Разделение Равное Подмножество Сумм
Мое решение вкратце: вызов 2 рекурсивных функций, одна из которых берет элемент и уменьшает сумму, другая не принимает элемент и движение вперед.
Решение приходит, когда 1 функция возвращает True, из-за ИЛИ
helper(s1 + nums[i], s2, i + 1, memo) or helper(s1, s2, i + 1, memo)
В моем коде я использовал динамический c программный подход, который сохраняет сумму.
hashed = (s1 + s2)
Является ли мое решение временной и пространственной сложностью O (N)?
Это мое решение:
class Solution:
def canPartition(self, nums: List[int]) -> bool:
def helper(s1, s2, i, memo):
# recursion
hashed = (s1 + s2)
if hashed in memo.keys():
return memo[hashed]
if s1 == s2: # we have 2 groups of sums that sums total
return True
if s1 > s2: # we have too big group
return False
if i == len(nums): # the end
return s1 == s2
# 2 options : move to next index with/witohut counting index
memo[hashed] = helper(s1 + nums[i], s2, i + 1, memo) or helper(s1, s2, i + 1, memo)
return memo[hashed]
# begin
s = sum(nums) # sum
memo = {} # dynamic programing
if s % 2 == 0: # odd sum can't be divided equally
return helper(0, s // 2, 0, memo)
return False