首页 > 试题广场 >

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

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

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


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

输入

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

输出

1 9
2 8

备注:

为什么测试用例过不了,提交却能成功?   

 n , t = map(int,input().split())
    arr = list(map(int,input().split()))
    arr = list(set(arr))
    arr.sort()
    r = len(arr) - 1 
    l = 0
    while l <= r :
        if arr[l] + arr[r] < t:
            l += 1
        elif arr[l] + arr[r] > t:
            r -= 1
        elif arr[l] + arr[r] == t:
            print(arr[l],arr[r])
            l += 1
            r -= 1
发表于 2022-06-16 12:04:06 回复(0)
n,k=map(eval,input().split())
arr=list(map(eval,input().split()))
re=set()
left=0
right=n-1
while left<right:
    if arr[left]+arr[right]>k:
        right-=1
    elif arr[left]+arr[right]<k:
        left+=1
    elif arr[left]+arr[right]==k:
        if (arr[left],arr[right]) not in re:
            print(arr[left],arr[right])
            re.add((arr[left],arr[right]))
        left+=1
        right-=1
一定要考虑重复值的问题
发表于 2022-04-10 12:08:32 回复(0)