python寻找数组里几个数字相加后在某个范围区间

查看 83|回复 6
作者:holmes8600   
python寻找数组里几个数字相加后在某个范围区间即可
要求不使用 itertools 模块中的 combinations 函数
前贴曾求过类似代码:https://www.52pojie.cn/thread-1749088-1-1.html
然而最完美的方法都是用的  itertools 模块中的 combinations 函数,这个函数有个缺点,当数组数量超过几十个甚至上百个以后,计算速度漫长到我看不到结果。。。
要求和上次稍微变更一点点:
就是有个数组,都是数字整数,
求其中哪几个数字相加之后在某个区间即可,不用匹配最接近。
[color=]例子:
这里有数组[1,2,3,3,4,4,6](数组中有可能有数字重复)数组长度可能会上1000
目标范围(9-11)
输出数组[1,2,3,3] 或者[2,3,6]或者[3,4,4] 等等等都可以
只需要输出1组数字即可,最少1个数字,多了没有上限(如果算法耗时过长,上限可设置最多4个)
要求不使用 itertools 模块中的 combinations 函数或者耗时特别长的函数。
参考问题代码:我不明白为啥这个for i 的循环2轮就循环完了,
[color=]#不知道为啥输出是(2,4,0)而不是(4,4,0)
有兴趣的大佬教教我为啥
[color=]def
[color=]calculate
(arr
[color=],
target):
   
#
首先初始化最小绝对值为
target
   
min_diff = target
   
#
用来保存数字对
   
result_pair = None
[color=]   
#
找到那对加和最接近
target
   
[color=]for
i
[color=]in
arr:
        arr1 = arr
        arr1.remove(i)
        
[color=]for
j
[color=]in
arr1:
            arr2 = arr1
            arr2.remove(j)
            
[color=]for
k
[color=]in
arr2:
               
[color=]if
i + j +k 8
[color=]print
(calculate(arr
[color=],
target))  
#不知道为啥输出是(2,4,0)而不是(4,4,0)

数组, 数字

liuyuno   

[Python] 纯文本查看 复制代码def calculate(arr, target):
    # 首先初始化最小绝对值为 target
    min_diff = target
    # 用来保存数字对
    result_pair = []
    # 找到那对加和最接近 target
    for i1,i in enumerate(arr):
        for i2,j in enumerate(arr[i1+1:]):
            for k in arr[i1+i2+2:]:
                if i + j +k
ciker_li   


liuyuno 发表于 2023-2-24 03:26
[mw_shl_code=python,true]def calculate(arr, target):
    # 首先初始化最小绝对值为 target
    min_d ...

你这个是只有3个数相加的情况吧?
bigheadghost   

复杂度2的n次方,嫌慢找到1个就输出
[Python] 纯文本查看 复制代码def calculate(arr, tmin,tmax):
    n=len(arr)
    result =[]
    for i in range(2**n):
        ibin=[int(j) for j in bin(i)[2:].zfill(n)]
        total=sum(a*b for a,b in zip(arr,ibin))
        if tmin
mirendedashu   

[Python] 纯文本查看 复制代码def find_continuous_numbers(arr, target_range):
    left, right = 0, 1
    cur_sum = arr[0] + arr[1]
    res = []
    while right  target_range:
            cur_sum -= arr[left]
            left += 1
        else:
            res += arr[left:right+1]
            right += 1
            cur_sum += arr[right] - arr[left]
            left += 1
    return res
arr = [1, 2, 3, 3, 4, 4, 6]
target_range = (9, 11)
print(find_continuous_numbers(arr, target_range))  # [1, 2, 3, 3]
liuyuno   


ciker_li 发表于 2023-2-24 09:04
你这个是只有3个数相加的情况吧?

帖子里 下面的问题
holmes8600
OP
  


bigheadghost 发表于 2023-2-24 09:08
复杂度2的n次方,嫌慢找到1个就输出
[mw_shl_code=python,true]def calculate(arr, tmin,tmax):
    n=le ...

def calculate(arr, tmin, tmax):
    n = len(arr)
    result = []
    for i in range(2 ** n):
        ibin = [int(j) for j in bin(i)[2:].zfill(n)]
        total = sum(a * b for a, b in zip(arr, ibin))
        if tmin <= total <= tmax:
            result = [arr

for p, v in enumerate(ibin) if v]
            print(result)
            return result
求教我这样是否正确,当数组有300左右的时候 也是算不出来结果。
我只需要输出1组即可  还可否优化速度的问下

您需要登录后才可以回帖 登录 | 立即注册

返回顶部