1、题目如下:
2、个人Python代码实现:
首先看到这题就会想到两种方式,一是四层循环暴力破解,二就是基于前面的三数之和外面加加一层嵌套。
先看一下暴力破解:
这里可以看到,当数据量足够大时,依旧会超时。但是在机考的时候,使用暴力破解未必不是一种方式,因为每题得分是按照用例通过数计算,也许可以得到该题的大部分分数。同时,实际上这里可以,先对数组nums进行排序,然后再进行循环,可以提升一部分性能,但是这个用例大概率还是不能通过。
3、题解Python代码实现
诚如上文说的,基于三数之和外加一层嵌套,实际上还是使用的双指针。但是个人并没有实现,浅看了一首题解, 就解出来了:
如果不好理解,建议先熟悉前面的三数之和和最接近三数之和(写给我自己,如果过段时间写不出来),再来理解本题
提交代码如下:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
count = len(nums) #计算数组nums长度
res = [] #输出数组
nums.sort() #数组nums进行升序排序
for a in range(count - 3): #a为四个数值中的第一个数
if a > 0 and nums[a-1] == nums[a]: #当遍历数组当前数值与前一个数值相同时,进入下一次循环
continue #当连续四个数值之和大于target,代表本次循环往后任意四个数值均大于target
if nums[a] + nums[a+1] + nums[a+2] + nums[a+3] > target:
break #当前数值与nums最后三个数值大于target时,意味着可能存在数值和等于target,进入下一次循环
if nums[a] + nums[count-3] + nums[count-2] + nums[count-1] < target:
continue #
for b in range(a+1,count-2): #b为四个数值中的第二个数
if b > a+1 and nums[b-1] == nums[b]: #去重,原理和第7行一致
continue
if nums[a] + nums[b] + nums[b+1] + nums[b+2] > target:#原理和第9行代码一致,注释在第8行
break
if nums[a] + nums[b] + nums[count-1] + nums[count-2] < target:#原理和第11行代码一致,注释在第8行
continue
c = b + 1 #c为四个数值中的第三个数,也就是左指针
d = count - 1 #d为四个数值中的第四个数,也就是右指针
while c < d:
sigma = nums[a] + nums[b] + nums[c] + nums[d]
if sigma > target:
d -= 1
elif sigma < target:
c += 1
else:
if res.count([nums[a], nums[b], nums[c], nums[d]]) == 0:
res.append([nums[a], nums[b], nums[c], nums[d]])
c += 1
d -= 1
return res