Вы находитесь на странице: 1из 2

class Solution:

# @return a list of lists of length 4, [[val1,val2,val3,val4]]


def fourSum(self, num, target):
if not num:
return []
num.sort()
op = []
backtrack([], num, target, 0, op)
sol = []
h = {k:True for k in op}
print "generated solution is:", op
for key in h.keys():
sol.append(list(key))
return sol

def backtrack(a, ip, sum, partialSum, op):


if isASolution(a, sum, partialSum):
processSolution(a, ip, op)
else:
nxtCandidates = constructCandidates(a, ip, sum, partialSum)
print nxtCandidates
for c in nxtCandidates:
a.append(c)
partialSum += ip[c]
backtrack(a, ip, sum, partialSum, op)
partialSum -= ip[c]
a.pop()

def isASolution(a, sum, partialSum):


return len(a) == 4 and sum == partialSum

def processSolution(a, ip, op):


print "Solution:",
quad = (ip[i] for i in a)
op.append(quad)
print op

def constructCandidates(a, ip, sum, partialSum):


remainingSum = sum - partialSum
if len(a) == 4:
return []
if not a:
start = 0
else:
start = a[-1]+1
possibleNxt = []
for i in range(start, len(ip)):
if ip[i] <= remainingSum:
possibleNxt.append(i)
else:
break

nxt = []
m = max(ip)
remainingCandidates = 4 - (len(a)+1)
for c in possibleNxt:
s = partialSum + ip[c]
if (m*remainingCandidates) < (sum - s):
continue
nxt.append(c)
return nxt

sol = Solution()
print sol.fourSum([1,-2,-5,-4,-3,3,3,5], -11)

Вам также может понравиться