4Sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0 -1 0 -2 2}, and target = 0. A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)
类似于leetcode 15 3sum。采用类似的思路,O(n^3),超时。。
class Solution:
def find(self,s,start,end,num):
while start<=end:
mid=(start+end)/2
if s[mid]==num:
return True
elif s[mid]>num:
end=mid-1
else:
start=mid+1
return False
# @return a list of lists of length 3, [[val1,val2,val3]]
def fourSum(self, num, target):
a=sorted(num)
l=len(a)
lst=[]
for i in range(l-3):
if i>=1 and a[i-1]==a[i]:
continue
for j in range(i+1,l-2):
if j!=i+1 and a[j]==a[j-1]:
continue
for k in range(j+1,l-1):
if k!=j+1 and a[k]==a[k-1]:
continue
if self.find(a,k+1,l-1,target-a[i]-a[j]-a[k]):
lst.append( [a[i],a[j],a[k],target-a[i]-a[j]-a[k]] )
return lst
在此基础上优化:
增加一个字典缓存exist={},把每两个数的和都加入字典;如果target-a[i]-a[j]不在字典中,则不必继续查找。时间复杂度平均降到O(n^2)
def fourSum(self, num, target):
a=sorted(num)
l=len(a)
lst=[]
exist={}
<span style="color:#ff6666;"> for i in range(l-1):
for j in range(l):
exist[a[i]+a[j]]=True</span>
for i in range(l-3):
if i>=1 and a[i-1]==a[i]:
continue
for j in range(i+1,l-2):
if j!=i+1 and a[j]==a[j-1]:
continue
<span style="color:#ff0000;">if exist.get(target-a[i]-a[j],False):</span>
for k in range(j+1,l-1):
if k!=j+1 and a[k]==a[k-1]:
continue
if self.find(a,k+1,l-1,target-a[i]-a[j]-a[k]):
lst.append( [a[i],a[j],a[k],target-a[i]-a[j]-a[k]] )
return lst