Python 3.x O(n)澄清中的Python对和问题

Python 3.x O(n)澄清中的Python对和问题,python-3.x,list,set,Python 3.x,List,Set,给定一个整数数组,输出总和为特定值k的所有唯一对 这是标准溶液,在O(n)时间内: 如果len(arr)

给定一个整数数组,输出总和为特定值k的所有唯一对

这是标准溶液,在O(n)时间内:


如果len(arr)<2:
返回
seen=set()
输出=设置()
对于arr中的num:
目标=k-num
如果未看到目标:
seen.add(num)
其他:
添加((最小值(num,目标值),最大值(num,目标值)))
返回打印('\n'.join(映射(str,列表(输出)))
关于此解决方案,我有几个问题:

1) 为什么我们要使用集合来存储数组的可见值?为什么不列一份清单呢?这会改变什么吗

2) 为什么是最小值(num,target),最大值(num,target)?这是为了保持格式一致,还是有更深层次的原因?起初,我认为应该处理重复的情况,如(1,3)和(3,1),但这个解决方案没有遇到我不认为的情况?

1)Set是python中检查值是否存在的更快的方法,而不是存储在这种情况下不需要的重复项
2) 执行
(min(num,target),max(num,target))
的原因可能是向输出集添加一个元组,该元组包含两个数字,其顺序为(min,max),它将以更好的格式在最后一个print语句中打印

请参阅关于为什么使用集合而不是列表的说明。当检查它们是否已经包含值时,它们的效率更高。

    if len(arr) < 2:
        return 

    seen = set()
    output = set()

    for num in arr: 

        target = k - num

        if target not in seen: 
            seen.add(num)

        else:
            output.add((min(num, target), max(num, target))) 


    return print('\n'.join(map(str, list(output))))