📅  最后修改于: 2023-12-03 15:28:45.064000             🧑  作者: Mango
本题是GATE-CS-2016(套装2)中的第10题,涉及编程知识,需要对编程有一定了解方能解答。
题目描述如下:
有一个排序过的整数数组,其中每一个元素可能是正数、负数或零。给定一个整数k,编写一个函数来计算数组中所有k元组(a,b,c,d),其中a + b + c + d = 0。函数应该返回所有这样的k元组的列表,列表中的k元组应按照字典序排序。
如果没有这样的k元组,则函数应该返回一个空列表。
函数的原型如下:
def fourSum(arr: List[int], k: int) -> List[List[int]]:
pass
其中,arr
表示输入的整数数组,k
表示要求和为0的k元组,函数应该返回所有符合要求的k元组的列表。
这是一道经典的寻找四个数和为指定值的问题,可以使用类似于三数之和的方法来解决。
首先对数组进行排序,然后使用四个指针i、j、l、r来分别表示四个数的位置,i和j遍历数组,l和r分别从i和j的后面开始,向中心靠近。
在遍历的过程中,如果出现四个数的和为指定值k,则将结果保存到列表中,并且继续遍历。如果四个数的和小于k,则将左指针右移;如果大于k,则将右指针左移。
需要注意的是,为了避免重复的结果,需要对四个指针的值进行去重操作,即如果当前指针指向的数和上一个指针指向的数相同,则直接跳过。
下面给出python的实现代码:
from typing import List
def fourSum(arr: List[int], k: int) -> List[List[int]]:
n = len(arr)
arr.sort()
res = []
for i in range(n - 3):
if i > 0 and arr[i] == arr[i-1]:
continue
for j in range(i + 1, n - 2):
if j > i + 1 and arr[j] == arr[j-1]:
continue
l = j + 1
r = n - 1
while l < r:
if arr[i] + arr[j] + arr[l] + arr[r] == k:
res.append([arr[i], arr[j], arr[l], arr[r]])
while l < r and arr[l] == arr[l+1]:
l += 1
while l < r and arr[r] == arr[r-1]:
r -= 1
l += 1
r -= 1
elif arr[i] + arr[j] + arr[l] + arr[r] < k:
l += 1
else:
r -= 1
return res
本题是一道高频考题,解决方法类似于三数之和,关键要点是排序和去重。掌握了这类问题的解法,可以极大地提高代码效率。