1.
给定一个 n 个整数的数组 nums 和目标值 target,判断 nums 中是否存在四个元素和值与 target 相等?找出所有满足条件且不重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[[-1, 0, 0, 1],[-2, -1, 1, 2],[-2, 0, 0, 2]]
def fourSum(nums,target):
l = len(nums)
nums.sort()
res = []
for start in range(0, l - 3):
if nums[start] == nums[start + 1]: continue
next_start = start + 1
while next_start < l - 2:
while nums[next_start] == nums[next_start + 1]: next_start += 1
i = next_start + 1
j = l - 1
while i < j:
while i + 1 < j and nums[i] == nums[i + 1]: i += 1
while i < j - 1 and nums[j] == nums[j - 1]: j -= 1
four_sum = nums[start] + nums[next_start] + nums[i] + nums[j]
if four_sum > target:
j -= 1
elif four_sum < target:
i += 1
else:
re = []
re.append(nums[start])
re.append(nums[next_start])
re.append(nums[i])
re.append(nums[j])
res.append(re)
i += 1
j -= 1
while i + 1 < j and nums[i] == nums[i + 1] : i += 1
while i < j - 1 and nums[j] == nums[j - 1] : j -= 1
next_start += 1
return res
思路是:
先排序,在固定数组中前两个数字,在用双指针 从剩下的数字中从头尾扫描。
结果有重复的结果。
换一个思路:
先排序,在固定数组中头尾的数字,再在中用双指针扫描。
l = len(nums)
nums.sort()
res = []
str_res = []
for start in range(0, l - 3):
end = l - 1
while end >= start + 3:
i = start + 1
j = end - 1
while i < j:
four_sum = nums[start] + nums[end] + nums[i] + nums[j]
if four_sum > target:
j -= 1
elif four_sum < target:
i += 1
else:
re = []
s = str(abs(nums[start])) + str(abs(nums[i])) +str(abs(nums[j])) +str(abs(nums[end]))
if not str_res.__contains__(s):
str_res.append(s)
re.append(nums[start])
re.append(nums[i])
re.append(nums[j])
re.append(nums[end])
res.append(re)
i += 1
j -= 1
end -= 1
return res
总结: 第一个主要是用了while 把相同的数字的跳过,导致结果又遗漏或缺失,用一个list集合保存数字组合的字符串,然后判断list集合中是否存在,存在就跳过不保存到结果集合中。