题目:
思路:因为是四个数,此时需要固定两个数的位置,移动另外两个数的位置就能做到遍历。
设i从第0个开始,j从第1个开始,k从第2个开始,l从最后一个开始,即:
for i in range(0, len(nums)):
for j in range(i+1, len(nums)-2):
k = j + 1
l = len(nums) - 1
之后判断四个数的和是否等于target,相等则加入res数组,不等就继续查找,如果当前值小于target,则移动k,大于就移动l。
完整代码如下:
提示:最后那部分是去重操作(我第一次WA就是因为忘记去重)
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
res = []
# 数组长度<4
if not nums or len(nums) < 4:
return res
# 前四个比目标大,无解
if nums[0] + nums[1] + nums[2] + nums[3] > target:
return res
# 后四个比目标小,无解
if nums[-1] + nums[-2] + nums[-3] + nums[-4] < target:
return res
for i in range(0, len(nums)):
for j in range(i+1, len(nums)-2):
k = j + 1
l = len(nums) - 1
while k < l:
if nums[i] + nums[j] + nums[k] + nums[l] == target:
res.append([nums[i], nums[j], nums[k], nums[l]])
k = k + 1
# 遇到重复数字则跳过
while k < l and nums[k] == nums[k-1]:
k = k + 1
# 如果加起来小于target,k右移
elif nums[i] + nums[j] + nums[k] + nums[l] < target:
k = k + 1
# 否则l左移
else:
l = l - 1
# 去重
r = []
for i in res:
if i not in r:
r.append(i)
return r