python - 数组的所有排列,其中数组中的每个元素必须按0到n之间的范围递增

标签 python algorithm math rust array-algorithms

假设我有一个带有值的元素列表

[1, 2, 3, 5, 6, 7, 9, 12]
基本上,数组中的元素最大可能具有n的差,在这种情况下为三个,且差值递增。
上面的数组将像这样工作:
2-1 = 1 | difference of 1
3-2 = 1 | difference of 1
5-3 = 2 | difference of 2
6-5 = 1 | difference of 1
等等。
我将如何找到长度为x且最大差为n的数组的所有排列?

最佳答案

假设您正在寻找绝对值的差异,则可以通过将每个合格元素逐步添加到结果中来递归地执行此操作:
这是使用递归生成器函数的示例:

def permuteSort(A,maxDiff,previous=None):
    if not A: yield []; return
    for i,a in enumerate(A):           
        if previous is not None and abs(a-previous) > maxDiff:               
            continue
        yield from ([a]+p for p in permuteSort(A[:i]+A[i+1:],maxDiff,a))
输出
for p in  permuteSort([1, 2, 3, 5, 6, 7, 9, 12],3):
    print(p,"differences:",[b-a for a,b in zip(p,p[1:])])
        
  
[1, 2, 3, 5, 6, 7, 9, 12] differences: [1, 1, 2, 1, 1, 2, 3]
[1, 2, 3, 5, 7, 6, 9, 12] differences: [1, 1, 2, 2, -1, 3, 3]
[1, 2, 3, 6, 5, 7, 9, 12] differences: [1, 1, 3, -1, 2, 2, 3]
[1, 2, 5, 3, 6, 7, 9, 12] differences: [1, 3, -2, 3, 1, 2, 3]
[1, 3, 2, 5, 6, 7, 9, 12] differences: [2, -1, 3, 1, 1, 2, 3]
[1, 3, 2, 5, 7, 6, 9, 12] differences: [2, -1, 3, 2, -1, 3, 3]
[2, 1, 3, 5, 6, 7, 9, 12] differences: [-1, 2, 2, 1, 1, 2, 3]
[2, 1, 3, 5, 7, 6, 9, 12] differences: [-1, 2, 2, 2, -1, 3, 3]
[2, 1, 3, 6, 5, 7, 9, 12] differences: [-1, 2, 3, -1, 2, 2, 3]
[3, 1, 2, 5, 6, 7, 9, 12] differences: [-2, 1, 3, 1, 1, 2, 3]
[3, 1, 2, 5, 7, 6, 9, 12] differences: [-2, 1, 3, 2, -1, 3, 3]
[5, 2, 1, 3, 6, 7, 9, 12] differences: [-3, -1, 2, 3, 1, 2, 3]
[6, 3, 1, 2, 5, 7, 9, 12] differences: [-3, -2, 1, 3, 2, 2, 3]
[7, 5, 2, 1, 3, 6, 9, 12] differences: [-2, -3, -1, 2, 3, 3, 3]
[12, 9, 6, 3, 1, 2, 5, 7] differences: [-3, -3, -3, -2, 1, 3, 2]
[12, 9, 6, 7, 5, 2, 1, 3] differences: [-3, -3, 1, -2, -3, -1, 2]
[12, 9, 6, 7, 5, 2, 3, 1] differences: [-3, -3, 1, -2, -3, 1, -2]
[12, 9, 6, 7, 5, 3, 1, 2] differences: [-3, -3, 1, -2, -2, -2, 1]
[12, 9, 6, 7, 5, 3, 2, 1] differences: [-3, -3, 1, -2, -2, -1, -1]
[12, 9, 7, 5, 2, 1, 3, 6] differences: [-3, -2, -2, -3, -1, 2, 3]
[12, 9, 7, 5, 6, 3, 1, 2] differences: [-3, -2, -2, 1, -3, -2, 1]
[12, 9, 7, 5, 6, 3, 2, 1] differences: [-3, -2, -2, 1, -3, -1, -1]
[12, 9, 7, 6, 3, 1, 2, 5] differences: [-3, -2, -1, -3, -2, 1, 3]
[12, 9, 7, 6, 3, 5, 2, 1] differences: [-3, -2, -1, -3, 2, -3, -1]
[12, 9, 7, 6, 5, 2, 1, 3] differences: [-3, -2, -1, -1, -3, -1, 2]
[12, 9, 7, 6, 5, 2, 3, 1] differences: [-3, -2, -1, -1, -3, 1, -2]
[12, 9, 7, 6, 5, 3, 1, 2] differences: [-3, -2, -1, -1, -2, -2, 1]
[12, 9, 7, 6, 5, 3, 2, 1] differences: [-3, -2, -1, -1, -2, -1, -1]

关于python - 数组的所有排列,其中数组中的每个元素必须按0到n之间的范围递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65229618/

相关文章:

python - 如何获得均匀分布的数组的位置坐标(n×2)?

python:列表操作

python - 你如何检查列表的项目是否等于同一列表中的另一个项目

python - 表明这种最长递增子序列算法错误的反例

python - 线程安全的redis客户端

php - 根据一组标准匹配人员

c++ - 计算相差 K 的数字的总数

javascript - 根据某个值进行 x 次计算

iOS - 如何使用带有一个未知参数的 NSExpression

java - 有效地处理非常小的 float 不准确