首页 > 试题广场 >

不重复打印排序数组中相加和为给定值的所有三元组

[编程题]不重复打印排序数组中相加和为给定值的所有三元组
  • 热度指数:12712 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定排序数组arr和整数k,不重复打印arr中所有相加和为k的严格升序的三元组
例如, arr = [-8, -4, -3, 0, 1, 1, 2, 4, 5, 8, 9], k = 10,打印结果为:
-4 5 9
-3 4 9
-3 5 8
0 1 9
0 2 8
1 4 5
其中三元组1 1 8不满足严格升序所以不打印
[要求]
时间复杂度为空间复杂度为


输入描述:
第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素


输出描述:
输出若干行,每行三个整数表示答案
按三元组从小到大的顺序输出(三元组大小比较方式为每个依次比较三元组内每个数)
示例1

输入

10 10
-8 -4 -3 0 1 2 4 5 8 9

输出

-4 5 9
-3 4 9
-3 5 8
0 1 9
0 2 8
1 4 5
示例2

输入

11 10
-8 -4 -3 0 1 1 2 4 5 8 9

输出

-4 5 9
-3 4 9
-3 5 8
0 1 9
0 2 8
1 4 5
示例3

输入

11 10
-8 -4 -3 0 1 1 2 4 4 8 9

输出

-3 4 9
0 1 9
0 2 8

备注:
def getRes(arr, n, k):
    if not arr:
        return
    # arr[i]代表三元组中第一个数字
    for i in range(n):
        # 去除重复数字
        if i > 0 and arr[i] == arr[i-1]:
            continue

        # 双指针搜索符合条件的二元组
        l, r = i+1, n-1
        while l < r:
            while l < r and l > i+1 and arr[l] == arr[l-1]:
                l += 1
            while l < r and r < n-1 and arr[r] == arr[r+1]:
                r -= 1
            if l >= r:
                break

            if arr[i] + arr[l] + arr[r] == k:
                if arr[i] < arr[l] < arr[r]:
                    print("{} {} {}".format(arr[i], arr[l], arr[r]))
                l, r = l+1, r-1
            elif arr[i] + arr[l] + arr[r] < k:
                l += 1
            else:
                r -= 1


if __name__ == '__main__':
    n, k = map(int, input().split())
    arr = list(map(int, input().split()))
    getRes(arr, n, k)

发表于 2021-12-27 10:53:55 回复(0)