class Solution(object):
def fourSum(self, nums, target):
lens = len(nums)
nums.sort()
res = []
if(not nums or lens < 4):
return res
## 第一层循环:确定i值
for i in range(lens - 3):
if i > 0 and nums[i] == nums[i - 1]:
continue
if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:
break
if nums[i] + nums[lens - 3] + nums[lens - 2] + nums[lens - 1] < target:
continue
#第二层循环:确定j值
for j in range(i + 1 , lens - 2):
if j > 1 and nums[j]==nums[j - 1] and j != i + 1:
continue
if nums[i] + nums[j] + nums[i + 1] + nums[i + 2] > target:
break
if nums[i] + nums[j] + nums[lens - 2] + nums[lens - 1] < target:
continue
left, right = j+1, lens-1
#与三数之和相同
while left<right:
ans = nums[left] + nums[right] + nums[i] + nums[j]
if ans == target:
res.append([nums[i],nums[j],nums[left],nums[right]])
while left<right and nums[left]==nums[left+1]:
left += 1
while left<right and nums[right]==nums[right-1]:
right -= 1
left += 1
right -= 1
elif ans < target:
left += 1
else:
right -= 1
return res
分析
- 先排序
- 然后两个for循环,确定前两个数,然后再在内循环中执行三数之和的操作
- 需要注意的就是前两层的循环需要剪枝处理
总结:n数之和的思想就是固定1个数或者2个数去遍历其余的数。使用双指针法或者hash法。