Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找添加到某个值的成对数字?_Python_Python 3.x_Algorithm - Fatal编程技术网

Python 查找添加到某个值的成对数字?

Python 查找添加到某个值的成对数字?,python,python-3.x,algorithm,Python,Python 3.x,Algorithm,我有一个函数匹配,它接受一个数字列表和一个目标数字,我想写一个函数,在数组中找到两个数字,这两个数字加在目标上 我的做法如下: >>>def匹配(值,目标=3): ... 对于我而言,价值观: ... 对于j值: ... 如果j!=一: ... 如果i+j==目标: ... 返回打印(f'{i}和

我有一个函数匹配,它接受一个数字列表和一个目标数字,我想写一个函数,在数组中找到两个数字,这两个数字加在目标上

我的做法如下:


>>>def匹配(值,目标=3):
...     对于我而言,价值观:
...             对于j值:
...                     如果j!=一:
...                             如果i+j==目标:
...                                     返回打印(f'{i}和{j}')
...                             返回打印('无匹配对')

这个解决方案是勇敢的吗?可以改进吗?

还有改进的余地。现在,您有了一个嵌套循环。另外,当您使用
打印
时,不会
返回

当您迭代
值时,您会得到以下结果:

values = [1, 2, 3]
target = 3

first_value = 1
difference: 3 - 1 = 2
我们可以看到,为了使1加起来等于3,需要2。我们可以简单地询问值中的
2,而不是迭代

def match(values, target):
    values = set(values)
    for value in values:
        summand = target - value
        if summand in values:
           break
    else:
        print('No matching pair')
    print(f'{value} and {summand}')
编辑:将值转换为
,因为它在
中具有句柄
,比在
列表中查找要快。如果您需要这些对的索引,例如在LeetCode问题中,您不应该将其转换为
集合
,因为您将丢失顺序。您还应该在for循环中使用
enumerate
,以获取索引

编辑:
summand==value
边缘大小写

def match(values, target):
    for i, value in enumerate(values):
        summand = target - value
        if summand in values[i + 1:]:
           break
    else:
        print('No matching pair')
        return
    print(f'{value} and {summand}')

最好的方法将产生O(NlogN)解

  • 如果您对列表进行排序,这将花费O(NlogN)
  • 一旦对列表进行了排序,就会得到两个索引,前者指向第一个元素,后者指向最新的元素,然后检查元素的总和是否与目标匹配。如果总和高于目标,则向下移动上索引;如果总和低于目标,则向上移动下索引。当上索引等于下索引时结束。这个操作是线性的,可以在O(N)时间内完成

  • 总之,你有O(NlogN)用于排序,O(N)用于索引,使整个解决方案的复杂性达到O(NlogN)。

    我认为这是一个问题,为什么@jweyrich?
    summand in values
    是一个伪装的循环,你的解决方案是相同的O(N^2)——这里没有太多改进。它输出了
    1和3
    ,所以它输出了。作为旁注,这不是最有效的方法。优化版本正在使用字典。键入错误,应为“使用值尝试目标
    2
    [1,2,3]
    --我打赌您的算法将找到一个不存在的对“它找到了一个对,但我忘记了大小写。WARE
    summand==value
    。要解决这个问题,您只需删除
    集合
    ,因为它是不可订阅的。您还必须使用
    enumerate
    跟踪索引,并在值[i+1:][/code>中执行以下
    求和操作。