📜  门| GATE-CS-2016(套装2)|问题 10(1)

📅  最后修改于: 2023-12-03 15:28:45.064000             🧑  作者: Mango

门| GATE-CS-2016(套装2)|问题 10

本题是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
总结

本题是一道高频考题,解决方法类似于三数之和,关键要点是排序和去重。掌握了这类问题的解法,可以极大地提高代码效率。