========坚持30天刷leetcode=====
题目链接:https://leetcode-cn.com/problems/4sum/
分析:
本题的解题思路与上一题类似,排序,然后先固定几个位置,再首尾各一个变量移动遍历。关键在于:特殊情况的判别,从而降低时间复杂度。
class Solution:
def fourSum(self, nums, target):
k=len(nums)
if k<4: return None # 特殊情况: 数组小于4
if k==4 and sum(nums)==target: return [nums] # 特殊情况: 数组等于4
nums.sort()
if nums[0]*4> target: # 特殊情况: 最小4个数和 大于target
return []
if nums[k-1]*4<target: # 特殊情况: 最大4个数和 小于target
return []
if nums[0]+nums[1]+nums[2]+nums[3] == target: # 特殊情况: 最小4个数和 等于target
return [nums[0:4]]
if nums[k-4]+nums[k-3]+nums[k-2]+nums[k-1]==target: # 特殊情况: 最大4个数和 等于target
return [nums[k-4:]]
result=[]
for a in range(k-3): # 遍历数组
if a!=0 and nums[a]==nums[a-1]: # 特殊情况
continue
if nums[a]+nums[a+1]+nums[a+2]+nums[a+3]>target:
break
if nums[a]+nums[k-3]+nums[k-2]+nums[k-1]<target:
continue
for b in range(a+1,k-2):
if b!=a+1 and nums[b]==nums[b-1]: # 特殊情况
continue
if nums[a]+nums[b]+nums[b+1]+nums[b+2]>target:
break
if nums[a]+nums[b]+nums[k-2]+nums[k-1]<target:
continue
c=b+1
d=k-1
while c<d:
if nums[a]+nums[b]+nums[c]+nums[d] == target:
result.append([nums[a],nums[b],nums[c],nums[d]])
c+=1 # 移动c、d
while c < d and nums[c-1] == nums[c]: c+= 1
d-=1
while c < d and nums[d] == nums[d+1]: d-= 1
elif nums[a]+nums[b]+nums[c]+nums[d]<target: # 移动 c
c+=1
while c < d and nums[c-1] == nums[c]: c+= 1
else: # 移动 d
d-=1
while c < d and nums[d] == nums[d+1]: d-= 1
return result